Engee 文档
Notebook

异常处理

在执行程序时,可能会发生各种异常(错误),如果不进行处理,则停止程序的执行。 要避免这种情况并继续沿着替代路径执行,可以使用try/catch运算符。

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 (generic function with 1 method)

我们输出执行sqrt_second函数的结果:

In [ ]:
println(sqrt_second([1 4]),
        "\n", sqrt_second([1 -4]),
        "\n", sqrt_second(9))
2.0
0.0 + 2.0im
3.0

在某些情况下,可能不仅需要处理异常,还需要在try块成功执行时运行一些代码。 为此,在catch块之后,可以指定else,该块在以前未发出错误时运行。:

In [ ]:
x = []
try
    x = read("file.txt", String) # для проверки работы try/catch замените название файла на любое другое
catch
    println("Файл не был прочитан")
else
    println(x)
end
Hello world

关键字finally提供了一种运行某些代码的方法,无论它如何在try块中结束。 例如,您可以确保在下一个代码单元格中关闭打开的文件。:

In [ ]:
f = open("file.txt","w")
try
    write(f, "Hello world") # измените текстовую запись и проверьте перезаписанный файл
finally
    close(f)
end;