Документация 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;