Обработка исключений¶
При выполнении программ могут возникать разнообразные исключения (ошибки), которые, в случае отсутствия их обработки, останавливают выполнение программы. Чтобы этого избежать, и продолжить выполнение по альтернативному пути, можно воспользоваться операторами try/catch.
Оператор try/catch позволяет проверять исключения и корректно обрабатывать результаты, которые могут нарушить работу вашей программы. Например, в приведенном ниже коде функция для вычисления квадратного корня обычно генерирует исключение. Поместив вокруг него блок try/catch можно этого избежать. Выбор того, как обрабатывать это исключение, регистрировать ли его, возвращать значение-заполнитель или, как в случае ниже, выводить инструкцию, делает разработчик. При принятии решения о том, как справляться с непредвиденными ситуациями, следует учитывать, что использование блока try/catch намного медленнее, чем использование условного ветвления.
try
sqrt("ten")
catch e
println("Вы должны ввести числовое значение")
end
Операторы try/catch также позволяют сохранять исключение в переменной. Следующий надуманный пример вычисляет квадратный корень из второго элемента x, если x является индексируемым, в противном случае предполагается, что x - действительное число, и возвращает его квадратный корень:
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
Выводим результат выполнения функции sqrt_second:
println(sqrt_second([1 4]),
"\n", sqrt_second([1 -4]),
"\n", sqrt_second(9))
В некоторых случаях может потребоваться не только обработка исключения, но и запуск некоторого кода в случае успешного выполнения блока try. Для этого после блока catch может быть указано else, которое запускается всякий раз, когда ранее не было выдано никакой ошибки:
x = []
try
x = read("file.txt", String) # для проверки работы try/catch замените название файла на любое другое
catch
println("Файл не был прочитан")
else
println(x)
end
Ключевое слово finally предоставляет способ запуска некоторого кода, независимо от того, как он завершается в блоке try. Например, можно гарантировать, что открытый файл будет закрыт в следующей кодовой ячейке:
f = open("file.txt","w")
try
write(f, "Hello world") # измените текстовую запись и проверьте перезаписанный файл
finally
close(f)
end;