不久前我问了一个类似的问题julialang:可以(应该)在编译时捕获这种类型的错误吗?,我想提出一个相关的问题。
function somefun()
for i = 1:10e10; sin(i); end # a time-consuming loop
nonexist_fun() # call to a non existing function => error
end
Run Code Online (Sandbox Code Playgroud)
这里nonexist_fun()
调用了一个不存在的函数并导致错误。不幸的是,错误仅在运行时被发现,在花费很长时间在内部执行一些先前的指令之后somefun()
,而不是在“解析时”。
题:
可以并且应该在初步的“解析时间”传递中发现这一点吗?
如果存在这样的“解析时间”选项,如何应用它?
否则,在运行之前检测和/或防止此类错误的推荐工作流程是什么,其中程序只有在已经浪费了很长时间执行后才会爆炸?
谢谢
不,该错误无法在“解析时”捕获,因为 julia 不需要在调用它们之前定义它们。一种语言要求这样做似乎是明智的,但结果证明对于相互递归的函数来说是相当痛苦的。(我使用过确实需要这样做的语言,这很痛苦。)
考虑:
julia> foo(x) = rand(Bool) ? bar(x) : 0
foo (generic function with 1 method)
julia> bar(x) = (println(x); foo(x+1))
bar (generic function with 1 method)
julia> foo(0)
0
1
2
3
4
0
Run Code Online (Sandbox Code Playgroud)
这两个函数都是独立解析的,但是如果您尝试检测该错误,则
通常:除了语法错误(以及宏扩展期间遇到的错误)外,julia 在解析(或编译时)不会抛出任何错误。
此外,捕获甚至是合法的MethodErrors
。我能想到这样做的几个很好的理由,除了以更好的错误消息重新抛出的目的。这是我之前在野外做过的,这个 try-catch 主要(但不完全是)用于MethodError
s。
您可能需要一个 linter 来为您检测这一点。至少是启发式的。现在就我所知,VC-Code linter : StaticLint.jl 没有捕捉到它。我确实记得 Julia 0.4 的旧 linter 之一可以捕获这样的事情,建议它用于 StaticLint.jl 可能是合理的。抓住它总是不可能的,但一些简单的情况可能是