Загрузка...

Исключения в Python'e

Тема в разделе Python создана пользователем Tmpvar 12 янв 2020. 249 просмотров

  1. Tmpvar
    Tmpvar Автор темы 12 янв 2020 сосу оила 27 29 июл 2019
    Исключения (exceptions) - ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.

    Самый простейший пример исключения - деление на ноль:
    Код

    >>> 100 / 0
    Traceback (most recent call last):
    File "", line 1, in
    100 / 0
    ZeroDivisionError: division by zero

    Виды исключений:
    BaseException - базовое исключение, от которого берут начало все остальные.

    • SystemExit - исключение, порождаемое функцией sys.exit при выходе из программы.

      • KeyboardInterrupt - порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
      • GeneratorExit - порождается при вызове метода close объекта generator.
      • Exception - а вот тут уже заканчиваются полностью системные исключения (которые лучше не трогать) и начинаются обыкновенные, с которыми можно работать.
        • StopIteration - порождается встроенной функцией next, если в итераторе больше нет элементов.
        • ArithmeticError - арифметическая ошибка.
          • FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто.
          • OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
          • ZeroDivisionError - деление на ноль.
        • AssertionError - выражение в функции assert ложно.
        • AttributeError - объект не имеет данного атрибута (значения или метода).
        • BufferError - операция, связанная с буфером, не может быть выполнена.
        • EOFError - функция наткнулась на конец файла и не смогла прочитать то, что хотела.
        • ImportError - не удалось импортирование модуля или его атрибута.
        • LookupError - некорректный индекс или ключ.
          • IndexError - индекс не входит в диапазон элементов.
          • KeyError - несуществующий ключ (в словаре, множестве или другом объекте).
        • MemoryError - недостаточно памяти.
        • NameError - не найдено переменной с таким именем.
          • UnboundLocalError - сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
        • OSError - ошибка, связанная с системой.
          • BlockingIOError
          • ChildProcessError - неудача при операции с дочерним процессом.
          • ConnectionError - базовый класс для исключений, связанных с подключениями.
            • BrokenPipeError
            • ConnectionAbortedError
            • ConnectionRefusedError
            • ConnectionResetError
          • FileExistsError - попытка создания файла или директории, которая уже существует.
          • FileNotFoundError - файл или директория не существует.
          • InterruptedError - системный вызов прерван входящим сигналом.
          • IsADirectoryError - ожидался файл, но это директория.
          • NotADirectoryError - ожидалась директория, но это файл.
          • PermissionError - не хватает прав доступа.
          • ProcessLookupError - указанного процесса не существует.
          • TimeoutError - закончилось время ожидания.
        • ReferenceError - попытка доступа к атрибуту со слабой ссылкой.
        • RuntimeError - возникает, когда исключение не попадает ни под одну из других категорий.
        • NotImplementedError - возникает, когда абстрактные методы класса требуют переопределения в дочерних классах.
        • SyntaxError - синтаксическая ошибка.
          • IndentationError - неправильные отступы.
            • TabError - смешивание в отступах табуляции и пробелов.
        • SystemError - внутренняя ошибка.
        • TypeError - операция применена к объекту несоответствующего типа.
        • ValueError - функция получает аргумент правильного типа, но некорректного значения.
        • UnicodeError - ошибка, связанная с кодированием / раскодированием unicode в строках.
          • UnicodeEncodeError - исключение, связанное с кодированием unicode.
          • UnicodeDecodeError - исключение, связанное с декодированием unicode.
          • UnicodeTranslateError - исключение, связанное с переводом unicode.
        • Warning - предупреждение.
    Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try - except.

    Первый пример применения этой конструкции:
    Код

    >>> try:
    ... k = 1 / 0
    ... except ZeroDivisionError:
    ... k = 0
    ...
    >>> print(k)
    0

    В блоке try мы выполняем инструкцию, которая может породить исключение, а в блоке except мы перехватываем их. При этом перехватываются как само исключение, так и его потомки. Например, перехватывая ArithmeticError, мы также перехватываем FloatingPointError, OverflowError и ZeroDivisionError.
    Код

    >>> try:
    ... k = 1 / 0
    ... except ArithmeticError:
    ... k = 0
    ...
    >>> print(k)
    0


    Также возможна инструкция except без аргументов, которая перехватывает вообще всё (и прерывание с клавиатуры, и системный выход и т. д.). Поэтому в такой форме инструкция except практически не используется, а используется except Exception. Однако чаще всего перехватывают исключения по одному, для упрощения отладки (вдруг вы ещё другую ошибку сделаете, а except её перехватит).

    Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нужно непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было.

    Код

    >>> f = open('1.txt')
    >>> ints = []
    >>> try:
    ... for line in f:
    ... ints.append(int(line))
    ... except ValueError:
    ... print('Это не число. Выходим.')
    ... except Exception:
    ... print('Это что ещё такое?')
    ... else:
    ... print('Всё хорошо.')
    ... finally:
    ... f.close()
    ... print('Я закрыл файл.')
    ... # Именно в таком порядке: try, группа except, затем else, и только потом finally.
     
    12 янв 2020 Изменено
  2. oriole
    oriole 12 янв 2020 был(а) давно
    Ну и нахуя ?
     
  3. Tmpvar
    Tmpvar Автор темы 12 янв 2020 сосу оила 27 29 июл 2019
    oriole, Умный на столько, что все ошибки и исключения знаешь?
     
  4. 893
    Ритик
    лол ты блять просто с сайта спиздил
     
  5. oriole
    oriole 12 янв 2020 был(а) давно
    а нахуя их все знать ?
     
  6. 893
    Ритик
    один ексепт сделать и все, не ебать мозги...
     
  7. oriole
    oriole 12 янв 2020 был(а) давно
    except Exception as e
     
  8. Tmpvar
    Tmpvar Автор темы 12 янв 2020 сосу оила 27 29 июл 2019
    Блять, я про это в теме и говорил
    --- Сообщение объединено с предыдущим 12 янв 2020
    Тебе и не говорят чтоб ты их все знал, а тема это как памятка
     
  9. setcode
    setcode 12 янв 2020 27 10 май 2019
    да не, полезная тема однозначно. Я сам чаще всего запелю
    Код

    except:
    pass
    И как бы похуй, но все ровно, есть моменты когда надо отталкивать от исключений и принимать иное решение..
     
Загрузка...
Top