Julia 为什么最终会阻止错误?

Julia 为什么最终会阻止错误?,julia,Julia,从这里的finally部分:,他们使用以下示例: f = open("file") try # operate on file f finally close(f) end 在REPL中运行类似代码时,会发生以下情况: julia> f = open("myfile.txt") IOStream(<file myfile.txt>) julia> try sqrt(-10) finally close(f

从这里的
finally
部分:,他们使用以下示例:

f = open("file")
try
    # operate on file f
finally
    close(f)
end
在REPL中运行类似代码时,会发生以下情况:

julia> f = open("myfile.txt")
IOStream(<file myfile.txt>)

julia> try
       sqrt(-10)
       finally 
         close(f)
       end
ERROR: DomainError:
 [inlined code] from none:2
 in anonymous at no file:0
julia>f=open(“myfile.txt”)
IOStream()
朱莉娅:试试看
sqrt(-10)
最后
关闭(f)
结束
错误:域错误:
[内联代码]来自无:2
在匿名中,没有文件:0

知道有什么区别吗?

最后
没有捕捉到异常。这是为了确保无论是否发生异常,都会执行清理步骤。请注意以下两者之间的区别:

try
    sqrt(-10)
catch
    println("Exception swallowed!")
end

通常情况下,人们会将捕获和最终捕获结合起来:

try
    sqrt(-10)
catch
    println("Swallowed exception.")
finally
    println("...but finally ran regardless.")
end

最后
仍然完成了这里的工作,因为已经执行了
close()
操作。您可以通过添加返回false的
isopen(f)
在代码中检查这一点。尽管如此,您还是会得到错误,因为您试图执行产生错误的操作。

try
块后面总是跟着
catch
块。在您的程序中,您忘记将catch块放在
finally
块之前。

虽然
try
块后面通常是
catch
块,但情况并非总是如此。有时,就像在文档中一样,您希望错误传播。。。但是不管怎样,文件都将被关闭。那么为什么我会得到错误呢?我猜这是误导,因为它看起来与打开的文件有关,但实际上与sqrt(-1)有关?是的,没错
sqrt(-1)
是一个
DomainError
,因为
sqrt
返回一个
Float64
。如果代码是
sqrt(-1+0im)
,那么它就可以正常工作。
try
    sqrt(-10)
catch
    println("Swallowed exception.")
finally
    println("...but finally ran regardless.")
end