异常处理¶
在执行程序时,可能会出现各种异常(错误),如果不加以处理,就会停止程序的执行。为了避免这种情况,并在另一条路径上继续执行,可以使用 try/catch 操作符。
使用尝试/捕获操作符,可以检查异常并正确处理可能导致程序崩溃的结果。例如,在下面的代码中,计算平方根的函数通常会产生异常。通过在其周围放置一个try/catch块,就可以避免这种情况。开发人员可以选择如何处理该异常,是记录该异常、返回一个占位值,还是像下面的情况一样打印一条指令。在决定如何处理异常时,请记住使用 try/catch 块要比使用条件分支慢得多。
In [ ]:
try
sqrt("ten")
catch e
println("Вы должны ввести числовое значение")
end
try/catch 语句还允许将异常存储在变量中。如果 x 是可索引的,则计算 x 的第二个元素的平方根,否则假定 x 是实数,并返回其平方根:
In [ ]:
sqrt_second(x) = try
sqrt(x[2])
catch y
if isa(y, DomainError)
sqrt(complex(x[2], 0))
elseif isa(y, BoundsError)
sqrt(x)
end
end
Out[0]:
输出执行 sqrt_second 函数的结果:
In [ ]:
println(sqrt_second([1 4]),
"\n", sqrt_second([1 -4]),
"\n", sqrt_second(9))
在某些情况下,可能不仅需要处理异常,还需要在 try 块成功执行后运行某些代码。为此,可在catch块后指定else,只要之前没有抛出错误,就会运行else:
In [ ]:
x = []
try
x = read("file.txt", String) # для проверки работы try/catch замените название файла на любое другое
catch
println("Файл не был прочитан")
else
println(x)
end
finally关键字提供了一种运行某些代码的方法,无论其在try代码块中如何终止。例如,你可以保证在下一个代码单元中关闭一个打开的文件:
In [ ]:
f = open("file.txt","w")
try
write(f, "Hello world") # измените текстовую запись и проверьте перезаписанный файл
finally
close(f)
end;