Обработка исключений: конструкция Try Except в Python
В этом уроке вы узнаете, как использовать конструкцию try…except в Python для корректной обработки исключений.
В Python существует два основных типа ошибок: синтаксические ошибки и исключения.
- Синтаксические ошибки
- Исключения
- Обработка исключений
- Перехват конкретных исключений
- Обработка нескольких исключений
Синтаксические ошибки
Когда вы пишете неверный код Python, вы получаете синтаксическую ошибку. Например:
current = 1 if current < 10 current += 1
Если вы попытаетесь запустить этот код, вы получите следующую ошибку:
File "d:/python/try-except.py", line 2 if current < 10 ^ SyntaxError: invalid syntax
В этом примере интерпретатор Python обнаружил ошибку в операторе if, поскольку после него отсутствует двоеточие(:). Интерпретатор Python показывает имя файла и номер строки, в которой произошла ошибка, чтобы вы могли ее исправить.
Исключения
Даже если ваш код имеет правильный синтаксис, он может вызвать ошибку во время выполнения.
В Python ошибки, возникающие во время выполнения, называются исключениями. Причины исключений в основном связаны со средой, в которой выполняется код. Например:
- Чтение файла, которого не существует.
- Подключение к удаленному серверу, который находится в автономном режиме.
- Неправильный ввод данных пользователем.
При возникновении исключения программа не обрабатывает его автоматически. Это приводит к появлению сообщения об ошибке.
Например, следующая программа рассчитывает рост продаж:
# get input net sales print('Enter the net sales for') previous = float(input('- Prior period:')) current = float(input('- Current period:')) # calculate the change in percentage change =(current - previous) * 100 / previous # show the result if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result)
Как это работает.
- Сначала предложите пользователям ввести два числа: чистый объем продаж за предыдущий и текущий периоды.
- Затем посчитайте рост продаж в процентах и покажите результат.
Когда вы запустите программу и введете 120 футов в качестве чистого объема продаж текущего периода, интерпретатор Python выдаст следующий результат:
Enter the net sales for - Prior period:100 - Current period:120' Traceback(most recent call last): File "d:/python/try-except.py", line 5, in <module> current = float(input('- Current period:')) ValueError: could not convert string to float: "120'"
Интерпретатор Python показал обратную трассировку, которая включает подробную информацию об исключении:
- Путь к файлу исходного кода(d:/python/try-Exception.py), вызвавшему исключение.
- Точная строка кода, вызвавшая исключение(строка 5).
- Оператор, вызвавший исключение current = float(input(‘- Текущий период:’)).
- Тип исключения ValueError.
- Сообщение об ошибке: ValueError: не удалось преобразовать строку в число с плавающей запятой: «120».
Поскольку метод float() не смог преобразовать строку 120′ в число, интерпретатор Python выдал исключение ValueError.
В Python исключения имеют разные типы, такие как TypeError, NameError и т. д.
Обработка исключений
Чтобы сделать программу более надежной, вам необходимо обрабатывать исключение после его возникновения. Другими словами, вам необходимо перехватить исключение и сообщить об этом пользователям, чтобы они могли его исправить.
Хороший способ справиться с этим — не показывать, что возвращает интерпретатор Python. Вместо этого вы заменяете это сообщение об ошибке более удобным для пользователя.
Для этого вы можете использовать оператор Python try…except:
try: # code that may cause error except: # handle errors
Оператор try…except работает следующим образом:
- Операторы в предложении try выполняются первыми.
- Если исключений не возникает, предложение исключений пропускается и выполнение оператора try завершается.
- Если исключение возникает в каком-либо операторе предложения try, остальная часть предложения пропускается и выполняется предложение исключения.
Следующая блок-схема иллюстрирует оператор try…except:
Таким образом, чтобы обрабатывать исключения с помощью оператора try…except, вы помещаете код, который может вызвать исключение, в предложение try, а код, который обрабатывает исключения, — в предложение исключения.
Вот как вы можете переписать программу и использовать оператор try…except для обработки исключения:
try: # get input net sales print('Enter the net sales for') previous = float(input('- Prior period:')) current = float(input('- Current period:')) # calculate the change in percentage change =(current - previous) * 100 / previous # show the result if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result) except: print('Error! Please enter a number for net sales.')
Если вы запустите программу еще раз и введете чистый объем продаж, который не является числом, программа вместо этого выдаст сообщение, которое вы указали в блоке except:
Enter the net sales for - Prior period:100 - Current period:120' Error! Please enter a number for net sales.
Перехват конкретных исключений
Если вы введете чистый объем продаж за предыдущий период равным нулю, вы получите следующее сообщение:
Enter the net sales for - Prior period:0 - Current period:100 Error! Please enter a number for net sales.
В этом случае чистые продажи предыдущего и текущего периодов являются числами, но программа все равно выдает сообщение об ошибке. Должно произойти еще одно исключение.
Оператор try…except позволяет вам обработать определенное исключение. Чтобы перехватить выбранное исключение, вы помещаете тип исключения после ключевого слова except:
try: # code that may cause an exception except ValueError as error: # code to handle the exception
Например:
try: # get input net sales print('Enter the net sales for') previous = float(input('- Prior period:')) current = float(input('- Current period:')) # calculate the change in percentage change =(current - previous) * 100 / previous # show the result if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result) except ValueError: print('Error! Please enter a number for net sales.')
Когда вы запустите программу и введете строку чистого объема продаж, вы получите то же сообщение об ошибке.
Однако если вы введете ноль для чистого объема продаж за предыдущий период:
Enter the net sales for - Prior period:0 - Current period:100
… вы получите следующее сообщение об ошибке:
Traceback(most recent call last): File "d:/python/try-except.py", line 9, in <module> change =(current - previous) * 100 / previous ZeroDivisionError: float division by zero
На этот раз вы получили исключение ZeroDivisionError. Это исключение деления на ноль вызвано следующим оператором:
change =(current - previous) * 100 / previous
А причина в том, что значение previous равно нулю.
Обработка нескольких исключений
Оператор try…except позволяет обрабатывать несколько исключений, указав несколько except:
try: # code that may cause an exception except Exception1 as e1: # handle exception except Exception2 as e2: # handle exception except Exception3 as e3: # handle exception
Это позволяет по-разному реагировать на каждый тип исключения.
Если вы хотите иметь одинаковый ответ на некоторые типы исключений, вы можете сгруппировать их в одно предложение except:
try: # code that may cause an exception except(Exception1, Exception2): # handle exception
В следующем примере показано, как использовать try…except для обработки исключений ValueError и ZeroDivisionError:
try: # get input net sales print('Enter the net sales for') previous = float(input('- Prior period:')) current = float(input('- Current period:')) # calculate the change in percentage change =(current - previous) * 100 / previous # show the result if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result) except ValueError: print('Error! Please enter a number for net sales.') except ZeroDivisionError: print('Error! The prior net sales cannot be zero.')
Когда вы вводите ноль для чистого объема продаж за предыдущий период:
Enter the net sales for - Prior period:0 - Current period:120
… вы получите следующую ошибку:
Error! The prior net sales cannot be zero.
Отлавливать другие общие ошибки можно, поместив блок catch Exception в конец списка:
try: # get input net sales print('Enter the net sales for') previous = float(input('- Prior period:')) current = float(input('- Current period:')) # calculate the change in percentage change =(current - previous) * 100 / previous # show the result if change > 0: result = f'Sales increase {abs(change)}%' else: result = f'Sales decrease {abs(change)}%' print(result) except ValueError: print('Error! Please enter a number for net sales.') except ZeroDivisionError: print('Error! The prior net sales cannot be zero.') except Exception as error: print(error)