«Достаточно сложно найти ошибки в вашем коде, если вы ее ищете; еще сложнее, если вы думаете, что в вашем коде нет ошибок», - Стив МакКоннелл.
Ошибки в жизни программиста неизбежны. Что интересно, когда вы пишете программу, ошибки могут даже посодействовать в выявлении логических и синтаксических ошибок в вашем коде.
Но, если вы еще до выполнения кода понимаете, что в определенном фрагменте может быть ошибка, то вы можете обработать эти ошибки и избавиться от них.
Почему важна обработка ошибок?
Обработка, или исправление, ошибок, о которых вы знаете, способствует тому, что код будет выполняться плавно, без каких-либо прерываний. Если в каких-либо строках кода возникают ошибки, то их обработка исправляет их, и выполнение кода продолжается.
Давайте приведем пример и разберемся, зачем нам нужна обработка ошибок:
a = 12
b = 6
result = a/b
print(result)
print("I have reached the end of the line")
Программа без ошибки
Что вы ожидаете увидеть, когда приведенный выше код выполнится? Ну что ж, переменная result выводит 2.0, а в следующей строке выводится I have reached the end of the line. Это мы сразу исключаем.
Давайте поменяем значение b с b = 6 на b = 0 и запустим программу.
1. a = 12
2. b = 0
3. result = a/b
4. print(result)
5. print("I have reached the end of the line")
Программа с ошибкой
Когда этот код выполнится, мы получим ошибку:
Сообщение об ошибке при b = 0
Код не печатает значение переменной result, но при этом не печатает и I have reached the end of the line.
Приведенное выше сообщение об ошибке division by zero означает, что мы пытаемся поделить какое-то число на 0.
Проблема находится в строке под номером 3. И даже если код не выводит значение переменной result, он должен вывести I have reached the end of the line. Но он этого не делает – почему?
Это потому, что интерпретатор Python остановился на третьей строке, когда a разделилось на 0. В этот момент он выдал ошибку в консоли и завершил выполнение кода.
Самое простое, что вы можете сделать, это жестко запрограммировать значения. Если значения a и b будут жестко запрограммированы, то, если вы запустите код, это в какой-то степени устранит эту ошибку.
Но может возникнуть иная серьезная проблема, если пользователь вдруг захочет указать значения a и b непосредственно во время выполнения кода.
a = int(input())
b = int(input())
result = a/b
print(result)
print("I have reached the end of the line")
Значения a и b вводятся пользователем
В таком случае есть очень большая вероятность того, что пользователь может ввести 0 в качестве входных данных для b. Чтобы обработать такую ожидаемую ошибку, мы будем использовать определенные методы обработки ошибок, которые помогут избежать прерывания потока выполнения (даже если пользователь введет любые недопустимые входные данные, например, 0 в качестве входных данных для b).
Как использовать ключевые слова try и except в Python?
Любые строки кода, которые больше остальных подвержены ошибкам, хранятся в блоке try. Если возникает какая-либо ошибка, то блок except устраняет их.
Структура кода выглядит примерно так:
try:
code that may/may not produce errors
except:
when error arises, then this block of code executes.
Otherwise, this block of code doesn't execute
Структура кода с ключевыми словами try и except
Давайте вернемся к нашему примеру, который мы уже обсуждали. Мы попробуем обработать ошибку division by zero с помощью блоков try/except.
Давайте добавим строки кода, для которых велика вероятность возникновения ошибки. В нашем случае, это строки 1-4. Итак, мы добавляем эти четыре строки в блок try:
try:
a = int(input())
b = int(input())
result = a/b
print(result)
except:
print("We caught an error")
print("I have reached the end of the line")
Блоки try и except для задачи деления
Теперь, когда мы передадим b значение 0, появится ошибка. Вследствие чего, будет выполнен блок except, и интерпретатор ыведет We caught an error, выйдет из блока и напечатает I have reached the end of the line.
В противном случае, если мы передим b ненулевое значение, то напечатается значение переменной result. Код выйдет из блока try и напечатает I have reached the end of the line.
В обоих случаях мы можем выполнить код от начала и до конца без каких-либо прерываний.
Помимо try и except, важно понимать, что такое ключевые слова else и finally, которые используются вместе с try и except.
Блок else идет после блоков try и except и выполняется в случае, если в блоке try не возникло ни одной ошибки. Блок finally идет за блоком else и выполняется независимо от того, возникают ли какие-то ошибки. Этот блок выполняется всегда.
И теперь, когда вы уже понимаете, как работают блоки try, except, else и finally, порядок выполнения будет следующим:
try:
code that may/may not produce errors
except:
when error arises, then this block of code executes
else:
when error doesn't arise, then this block of code executes
finally:
This block will execute whether error occurs or not.
Структура кода блоков ключевых слов для обработки ошибок
Применяя аналогичную структуру к задаче деления чисел, мы получим следующее:
try:
a = int(input())
b = int(input())
result = a/b
print(result)
except:
print("We caught an error")
else:
print("Hurray, we don't have any errors")
finally:
print("I have reached the end of the line")
Структура кода задачи деления числе после обработки ошибки с помощью ключевых слов
Если b присваивается значение 0, то мы получаем ошибку. Блок except выполняется и печатается We caught an Error, и выполняется блок finally и печатается I have reached the end of the line.
Поток выполнения кода при возникновении ошибок
В противном случае, если b присваивается, например, значение 6 (или любое другое ненулевое значение), то мы делим a на 6 и сохраняем это значение в переменную result. После чего код печатает значение переменной result.
Затем, выполняется блок else и печатается Hurray, we don't have any errors. И также выполняется блок finally и печатается I have reached the end of the line.
Поток выполнения кода без ошибок
Заключение
Я надеюсь, что теперь вы поняли, как можно реализовать обработку ошибок в Python с помощью блоков try/except для того, чтобы отлавливать потенциальные ошибки.
И также вы изучили, как использовать блоки else и finally, которые также связаны с методами обработки ошибок.