Как использовать в Python Try-Except

Применение try-except — наиболее распространенный способ обработки ошибок. В этой статье мы познакомимся с лучшими практиками использования try-except в Python.

Используя блок try, можно перехватить исключение и обработать ошибку внутри блока except. Всякий раз, когда код дает сбой внутри блока try, выполнение программы останавливается, и управление передается блоку исключений.

Для чего используются условия Try-Except / Try-Except-else?

С помощью try-except и try-except-else можно избежать многих проблем, которые могут возникнуть. Например, код Python, использующий стиль LBYL (Look before you leap), может привести к зацикливанию условий. В подобном случае поможет try-except.

Также бывают случаи, когда правильность выполнения кода зависит от актуальности данных. Например, код, вызывающий os.path.exists или Queue.full, может завершиться неудачно. Эти функции могут возвращать данные, которые устаревают к моменту их использования. Поэтому лучше использовать try-except-else.

Выведение исключений

В Python можно выводить исключение каждый раз, когда это необходимо. Это можно сделать, вызвав из кода [raise Exception (‘Test error!’)]. После чего исключение остановит текущее выполнение и перейдет дальше по стеку вызовов до тех пор, пока исключение не будет обработано.

Для чего используются исключения?

Исключения также используются для управления ошибками, которые возникают в циклах, при работе с базой данных, доступе к сети и т.д.

Обработка исключений — это искусство, которое помогает в написании надежного и качественного кода.

Python: советы по использованию Try-Except, Try-Except-Else и многое другое

Как в Python лучше всего использовать Try-Except

1. Как обрабатывать произвольное исключение

Иногда может понадобиться способ для обработки и вывода сообщения об ошибке.Это можно сделать с помощью исключений Python. Во время тестирования вы можете разместить код внутри блока try.

try:
#вашкод
exceptExceptionas ex:
print(ex)

2. Перехват нескольких исключений в одном блоке except

Можно перехватить несколько исключений в одном блоке except.

except(Exception1,Exception2)as e:
pass

Обратите внимание, что в Python 2.6 / 2.7 нужно отделить исключения от переменной запятой. Но этого нельзя делать в Python 3. Вместо этого необходимо использовать ключевое слово [as].

3. Обработка нескольких исключений в одном блоке except

Существует множество способов обработки сразу нескольких исключений. Первый из них требует размещения всех исключений, которые могут возникнуть. Смотрите приведенный ниже код:

try:
file= open('input-file','open mode')
except(IOError,EOFError)as e:
print("Testing multiple exceptions. {}".format(e.args[-1]))

Следующий метод — обрабатывать каждое исключение в отдельном блоке except:

try:
file= open('input-file','open mode')
exceptEOFErroras ex:
print("Caught the EOF error.")
raise ex
exceptIOErroras e:
print("Caught the I/O error.")
raiseex

Последний метод — использовать исключение без упоминания какого-либо атрибута исключения.

try:
file= open('input-file','open mode')
except:
# In case of any unhandled error, throw it away
raise

Последний вариант может быть полезен, если у вас нет информации об исключении, которое может возникнуть.

4. Повторное выведение исключений в Python

Однажды выведенные исключения продолжают обрабатываться в вызывающих их методах до тех пор, пока они не будут обработаны. Но можно добавить условие except, которое содержит только вызов [raise] без каких-либо аргументов. Это приведет к повторному исключению.

Смотрите приведенный ниже код.

try:
# Намеренноевыведениеисключения.
raiseException('I learn Python!')
except:
print("Entered in except.")
# Повторноевыведениеисключения.
raise

Вывод:

Enteredinexcept.
Traceback(most recent call last):
File"python", line 3,in<module>
Exception: I learn Python!

5. Когда использовать условие else

Используйте условие else после блока try-except. Оно будет выполняться в том случае, если исключение не будет выдано. Оператор else всегда должен предшествовать блокам except .

В блоках else можно добавить код, который необходимо запустить, если ошибок не возникло.

В приведенном ниже примере видно, что цикл while работает бесконечно. Код запрашивает значение у пользователя, а затем анализирует его с помощью встроенной функции [int()]. Если пользователь вводит нулевое значение, блок except будет заблокирован. В противном случае код будет проходить через блок else.

whileTrue:
# Введете с консоли целое число.
    x =int(input())

# Разделите 1 на x, чтобы протестировать ошибку
try:
result=1/ x
except:
print("Error case")
exit(0)
else:
print("Pass case")
exit(1)

6. Использование блока [finally]

Если есть код, который должен выполняться во всех случаях, разместите его внутри блока [finally]. Python всегда будет запускать эти инструкции. Это самый распространенный способ выполнения задач очистки. Вы также можете проверить это.

Ошибка перехватывается условием try. После того, как будет выполнен код в блоке except, выполняется инструкции в [finally].

Смотрите приведенный ниже код.

try:
# Намеренно выводим ошибку.
    x =1/0
except:
# УсловиеExcept:
print("Error occurred")
finally:
# УсловиеFinally:
print("The [finally clause] is hit")

Вывод:

Error occurred
The[finally clause]is hit

7. Используйте ключевое слово as для перехвата конкретных  типов исключений

С помощью <identifier> можно создать объект исключения. В приведенном ниже примере мы создаем объект IOError, а затем используем его внутри условия.

try:
# Намеренно выводим ошибку.
    f = open("no-file")
exceptIOErroras err:
# Создаемэкземпляр IOError дляучета.
print("Error:", err)
print("Code:",err.errno)

Вывод:

('Error:',IOError(2,'No such file or directory'))
('Code:',2)

8. Лучшие практики вывода исключений

Избегайте создания общих исключений, иначе конкретные exception также будут перехватываться. Лучшей практикой является отображение конкретного исключения, близкого к возникшей проблеме.

Не рекомендуется:

defbad_exception():
try:
raiseValueError('Intentional - do not want this to get caught')
raiseException('Exception to be handled')
exceptExceptionas error:
print('Inside the except block: '+repr(error))

bad_exception()

Вывод:

Inside the except block:ValueError('Intentional - do not want this to get caught',)

Рекомендуется:

В приведенном ниже примере перехватывается конкретный тип исключения, а не общий. Мы также используем параметр args для вывода некорректных аргументов, если они есть. Рассмотрим этот пример.

try:
raiseValueError('Testing exceptions: The input is in incorrect order','one','two','four')
exceptValueErroras err:
print(err.args)

Вывод:

('Testing exceptions: The input is in incorrect order','one','two','four')

9. Как пропустить ошибки и продолжить выполнение кода

Лучше не применять данную практику. Но если это нужно, то используйте следующий пример.

try:
assertFalse
exceptAssertionError:
pass
print('Welcome to Prometheus!!!')

Вывод:

Welcome to Prometheus!!!

Рассмотрим наиболее распространенные исключения в Python с примерами.

Распространенные ошибки исключений:

  • IOError–возникает, если файл не открывается.
  • ImportError — если модуль python не может быть загружен или размещен.
  • ValueError — возникает, если функция получает аргумент корректного типа, но с некорректным значением.
  • KeyboardInterrupt — когда пользователь прерывает выполнение кода нажатием на Delили Ctrl-C.
  • EOFError — когда функции input() / raw_input()достигают конца файла (EOF), но без чтения каких-либо данных.

Примеры распространенных исключений

exceptIOError:
print('Error occurred while opening the file.')

exceptValueError:
print('Non-numeric input detected.')

exceptImportError:
print('Unable to locate the module.')

exceptEOFError:
print('Identified EOF error.')

exceptKeyboardInterrupt:
print('Wrong keyboard input.')

except:
print('An error occurred.')

Как использовать Try-Except в Python

В процессе программирования ошибки неизбежны. Но их можно обработать, используя конструкции try-except или try-except-else, try-except-finally.

Перевод статьи «How To Best Use Try Except In Python – Especially For Beginners» был подготовлен дружной командой проекта Сайтостроение от А до Я.