Python try except any exception

Работа с исключениями try/except/else/finally#

Если вы повторяли примеры, которые использовались ранее, то наверняка были ситуации, когда выскакивала ошибка. Скорее всего, это была ошибка синтаксиса, когда не хватало, например, двоеточия.

Как правило, Python довольно понятно реагирует на подобные ошибки, и их можно исправить.

Тем не менее, даже если код синтаксически написан правильно, могут возникать ошибки. В Python эти ошибки называются исключения (exceptions).

In [1]: 2/0 ----------------------------------------------------- ZeroDivisionError: division by zero In [2]: 'test' + 2 ----------------------------------------------------- TypeError: must be str, not int 

В данном случае возникло два исключения: ZeroDivisionError и TypeError.

Чаще всего можно предсказать, какого рода исключения возникнут во время исполнения программы.

Например, если программа на вход ожидает два числа, а на выходе выдает их сумму, а пользователь ввел вместо одного из чисел строку, появится ошибка TypeError, как в примере выше.

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

Когда в программе возникает исключение, она сразу завершает работу.

Для работы с исключениями используется конструкция try/except :

In [3]: try: . : 2/0 . : except ZeroDivisionError: . : print("You can't divide by zero") . : You can't divide by zero 

Конструкция try работает таким образом:

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

    Обратите внимание, что строка Cool! в блоке try не выводится:

    In [4]: try: . : print("Let's divide some numbers") . : 2/0 . : print('Cool!') . : except ZeroDivisionError: . : print("You can't divide by zero") . : Let's divide some numbers You can't divide by zero 

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

    Например, скрипт divide.py делит два числа введенных пользователем:

    # -*- coding: utf-8 -*- try: a = input("Введите первое число: ") b = input("Введите второе число: ") print("Результат: ", int(a)/int(b)) except ValueError: print("Пожалуйста, вводите только числа") except ZeroDivisionError: print("На ноль делить нельзя") 

    Примеры выполнения скрипта:

    $ python divide.py Введите первое число: 3 Введите второе число: 1 Результат: 3 $ python divide.py Введите первое число: 5 Введите второе число: 0 На ноль делить нельзя $ python divide.py Введите первое число: qewr Введите второе число: 3 Пожалуйста, вводите только числа

    В данном случае исключение ValueError возникает, когда пользователь ввел строку вместо числа, во время перевода строки в число.

    Исключение ZeroDivisionError возникает в случае, если второе число было равным 0.

    Если нет необходимости выводить различные сообщения на ошибки ValueError и ZeroDivisionError, можно сделать так (файл divide_ver2.py):

    # -*- coding: utf-8 -*- try: a = input("Введите первое число: ") b = input("Введите второе число: ") print("Результат: ", int(a)/int(b)) except (ValueError, ZeroDivisionError): print("Что-то пошло не так. ") 
    $ python divide_ver2.py Введите первое число: wer Введите второе число: 4 Что-то пошло не так. $ python divide_ver2.py Введите первое число: 5 Введите второе число: 0 Что-то пошло не так.

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

    Это делать не рекомендуется!

    try/except/else#

    В конструкции try/except есть опциональный блок else. Он выполняется в том случае, если не было исключения.

    Например, если необходимо выполнять в дальнейшем какие-то операции с данными, которые ввел пользователь, можно записать их в блоке else (файл divide_ver3.py):

    # -*- coding: utf-8 -*- try: a = input("Введите первое число: ") b = input("Введите второе число: ") result = int(a)/int(b) except (ValueError, ZeroDivisionError): print("Что-то пошло не так. ") else: print("Результат в квадрате: ", result**2) 
    $ python divide_ver3.py Введите первое число: 10 Введите второе число: 2 Результат в квадрате: 25 $ python divide_ver3.py Введите первое число: werq Введите второе число: 3 Что-то пошло не так.

    try/except/finally#

    Блок finally — это еще один опциональный блок в конструкции try. Он выполняется всегда, независимо от того, было ли исключение или нет.

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

    Файл divide_ver4.py с блоком finally:

    # -*- coding: utf-8 -*- try: a = input("Введите первое число: ") b = input("Введите второе число: ") result = int(a)/int(b) except (ValueError, ZeroDivisionError): print("Что-то пошло не так. ") else: print("Результат в квадрате: ", result**2) finally: print("Вот и сказочке конец, а кто слушал - молодец.") 
    $ python divide_ver4.py Введите первое число: 10 Введите второе число: 2 Результат в квадрате: 25 Вот и сказочке конец, а кто слушал - молодец. $ python divide_ver4.py Введите первое число: qwerewr Введите второе число: 3 Что-то пошло не так. Вот и сказочке конец, а кто слушал - молодец. $ python divide_ver4.py Введите первое число: 4 Введите второе число: 0 Что-то пошло не так. Вот и сказочке конец, а кто слушал - молодец.

    Когда использовать исключения#

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

    Например, этот вариант кода:

    while True: a = input("Введите число: ") b = input("Введите второе число: ") try: result = int(a)/int(b) except ValueError: print("Поддерживаются только числа") except ZeroDivisionError: print("На ноль делить нельзя") else: print(result) break 

    Можно переписать таким образом без try/except (файл try_except_divide.py):

    while True: a = input("Введите число: ") b = input("Введите второе число: ") if a.isdigit() and b.isdigit(): if int(b) == 0: print("На ноль делить нельзя") else: print(int(a)/int(b)) break else: print("Поддерживаются только числа") 

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

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

    Если вы раньше использовали какой-то другой язык программирования, есть вероятность, что в нём использование исключений считалось плохим тоном. В Python это не так. Чтобы немного больше разобраться с этим вопросом, посмотрите ссылки на дополнительные материалы в конце этого раздела.

    raise#

    Иногда в коде надо сгенерировать исключение, это можно сделать так:

    raise ValueError("При выполнении команды возникла ошибка") 

    Встроенные исключения#

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

    Например, TypeError обычно генерируется когда ожидался один тип данных, а передали другой

    In [1]: "a" + 3 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) ipython-input-1-5aa8a24e3e06> in module> ----> 1 "a" + 3 TypeError: can only concatenate str (not "int") to str 

    ValueError когда значение не соответствует ожидаемому:

    In [2]: int("a") --------------------------------------------------------------------------- ValueError Traceback (most recent call last) ipython-input-2-d9136db7b558> in module> ----> 1 int("a") ValueError: invalid literal for int() with base 10: 'a' 

    Источник

    Читайте также:  Radio elements in html
Оцените статью