Julia 中的 Try-Catch 宏
Try-Catch Macro in Julia
我有以下功能
foo(x) = x + 1
bar(x) = x * 2
我在包装函数中使用它们(不确定这是否重要)。
function baz(x)
d = Dict{Symbol,Any}()
d[:foo] = foo(x)
d[:bar] = bar(x)
return d
end
问题是 foo()
和 bar()
可能会失败,在这种情况下我希望代码继续 运行。但是,引入 try catch
语句会使代码非常混乱。那么,是否有以下两种解决方案之一可以使这更容易?
梦想解决方案
一个我可以写在 d[:foo] = foo(x)
前面的宏,在失败的情况下会写一个默认值 do d[:foo]
.
也是一个解决方案
如果代码失败,将继续的宏。
因此,我设法做到了以下几点。但是,我不知道这是否是好的风格。
macro tc(ex)
quote
try
$(esc(ex))
catch
missing
end
end
end
@tc foo(1)
1
@tc foo("a")
missing
注意 $(esc(ex))
。这个很重要。如果表达式未转义,则宏将在全局范围内按预期工作,但不会在函数内部(如问题中所示)。如果有人能清楚地解释为什么会这样,请添加评论。
我有以下功能
foo(x) = x + 1
bar(x) = x * 2
我在包装函数中使用它们(不确定这是否重要)。
function baz(x)
d = Dict{Symbol,Any}()
d[:foo] = foo(x)
d[:bar] = bar(x)
return d
end
问题是 foo()
和 bar()
可能会失败,在这种情况下我希望代码继续 运行。但是,引入 try catch
语句会使代码非常混乱。那么,是否有以下两种解决方案之一可以使这更容易?
梦想解决方案
一个我可以写在 d[:foo] = foo(x)
前面的宏,在失败的情况下会写一个默认值 do d[:foo]
.
也是一个解决方案
如果代码失败,将继续的宏。
因此,我设法做到了以下几点。但是,我不知道这是否是好的风格。
macro tc(ex)
quote
try
$(esc(ex))
catch
missing
end
end
end
@tc foo(1)
1
@tc foo("a")
missing
注意 $(esc(ex))
。这个很重要。如果表达式未转义,则宏将在全局范围内按预期工作,但不会在函数内部(如问题中所示)。如果有人能清楚地解释为什么会这样,请添加评论。