Как лучше всего использовать Try Except в Python
В программировании на Python обработка исключений позволяет программисту включить управление потоком. Использование try-except является наиболее распространенным и естественным способом обработки непредвиденных ошибок наряду со многими другими конструкциями обработки исключений. В этом руководстве вы познакомитесь с некоторыми из лучших приемов использования try-except в Python.
Обработка ошибок или исключений в Python может быть осуществлена путем настройки исключений. Используя блок try, вы можете реализовать исключение и обработать ошибку внутри блока исключений. Всякий раз, когда код прерывается внутри блока try, обычный поток кода останавливается, и элемент управления переключается на блок except для обработки ошибки.
Зачем использовать конструкции Try-Except / Try-Except-else? С помощью Try-Except и Try-Except-Else вы можете избежать многих неизвестных проблем, которые могут возникнуть из вашего кода.
Вызов исключений также допустимо в Python. Это означает, что вы можете бросить или вызвать исключение, когда это необходимо. Вы можете сделать это, просто вызвав в вашем коде raise Exception(‘Test error!’). Возникнувшее исключение прекратит текущее выполнение как обычно и пойдет дальше в стек вызовов, пока не будет обработано
Зачем использовать исключения? Они не только помогают решать популярные проблемы, такие как состояние race, но также очень полезны для контроля ошибок в таких областях, как циклы, обработка файлов, обмен данными с базой данных, доступ к сети и т.
Следовательно, мы рассмотрим более широкие проблемы и предоставим решения в этом посте. Обратите внимание, что обработка исключений — это искусство, которое дает вам огромные возможности для написания надежного и качественного кода. Итак, приготовьтесь прочитать некоторые основные замечания по исключениям вместе с лучшими способами их обработки.
Python: советы по использованию Try-Except, Try-Except-Else и многое другое
1. Как обращаться с произвольным исключением
Иногда вам может понадобиться способ разрешить любое произвольное исключение, а также иметь возможность отображать сообщение об ошибке или исключении.
Это легко достижимо с помощью исключений Python. Проверьте код ниже. Во время тестирования вы можете поместить код внутри блока try как в следующем примере.
try: #your code except Exception as ex: print(ex)
2. Поймать несколько исключений в одном блоке 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. Вы можете добавить столько, Except блоков, сколько необходимо. Смотрите пример ниже.
try: file = open('input-file', 'open mode') except EOFError as ex: print("Caught the EOF error.") raise ex except IOError as e: print("Caught the I/O error.") raise ex
Последнее, но не менее важное, это использовать исключение без упоминания какого-либо атрибута исключения.
try: file = open('input-file', 'open mode') except: raise
Этот метод может быть полезен, если вы не имеете ни малейшего представления об исключении, которое может выдать ваша программа.
4. Повторный проброс исключений в Python
Возникшие когда-либо исключения продолжают перемещаться к вызывающим методам, пока не будут обработаны. Хотя вы можете добавить исключающее предложение, которое может просто вызывать raise без каких-либо аргументов. Это приведет к пересмотру исключения.
Смотрите приведенный ниже пример кода.
try: # Преднамеренно бросить исключение. raise Exception('I learn Python!') except: print("Entered in except.") # Возобновить исключение. raise
Вывод:
Entered in except. Traceback (most recent call last): File "python", line 3, in Exception: I learn Python!
5. Когда использовать Else
Используйте предложение else сразу после блока try-except. Предложение else будет получено, только если не сгенерировано исключение. Оператор else всегда должен предшествовать блокам except.
В блоки else вы можете добавить код, который хотите запустить, если ошибок не было.
В примере ниже, вы можете увидеть бесконечный цикл while. Код запрашивает ввод данных пользователем, а затем анализирует его, используя встроенную функцию int(). Если пользователь вводит значение ноль, тогда блоком исключений будет достигнут успех. В противном случае код будет проходить через блок else.
while True: x = int(input()) try: result = 1 / x except: print("Error case") exit(0) else: print("Pass case") exit(1)
6. Используйте Finally
Если у вас есть код, который вы хотите запустить во всех ситуациях, напишите его в блоке Это наиболее распространенный способ выполнения задач по очистке. Вы также можете убедиться, что очистка прошла.
Ошибка поймана в блоке try. После того, как код в блоке except будет выполнен, инструкции в блоке finally будут выполнены.
Обратите внимание, что блок finally будет ВСЕГДА работать, даже если вы вернулись раньше него.
Смотрите пример ниже.
try: x = 1 / 0 except: print("Error occurred") finally: print("The [finally clause] is hit")
Вывод:
Error occurred The [finally clause] is hit
7. Используйте ключевое слово As для отлова определенных типов исключений.
С помощью вы можете создать новый объект. В приведенном ниже примере мы создаем объект IOError и затем используем.
try: f = open("no-file") except IOError as err: print("Error:", err) print("Code:", err.errno)
Результат:
('Error:', IOError(2, 'No such file or directory')) ('Code:', 2)
8. Лучшая практика для создания исключений
Избегайте генерирования общих исключений, потому что если вы это сделаете, то должны быть перехвачены и все другие более конкретные исключения. Следовательно, лучшая практика заключается в том, чтобы поднять наиболее конкретное исключение, близкое к вашей проблеме.
Плохой пример:
def bad_exception(): try: raise ValueError('Intentional - do not want this to get caught') raise Exception('Exception to be handled') except Exception as 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: raise ValueError('Testing exceptions: The input is in incorrect order', 'one', 'two', 'four') except ValueError as err: print(err.args)
Результат:
('Testing exceptions: The input is in incorrect order', 'one', 'two', 'four')
9. Как пропустить ошибки и продолжить выполнение
В идеале, вы не должны этого делать. Но если вы все еще хотите это сделать, следуйте приведенному ниже коду, чтобы проверить правильный подход.
try: assert False except AssertionError: pass print('Welcome to Prometheus!!!')
Результат:
Welcome to Prometheus!!!
Теперь рассмотрим некоторые из наиболее распространенных исключений Python и их примеры.
Наиболее распространенные Exception Errors:
- IOError — происходит при ошибках файловой системы, например, если файл не открывается.
- ImportError — Если модуль Python не может быть загружен или не найден.
- ValueError — происходит, если функция получает аргумент правильного типа, но не подходящего значения.
- KeyboardInterrupt — когда пользователь вводит ключ прерывания (т.е. Control-C или Del в консоли)
- EOFError — Возникает, если входные функции (input() / raw_input()) попадают в условие конца файла (EOF), но без чтения каких-либо данных.
Примеры наиболее распространенных исключений
except IOError: print('Error occurred while opening the file.') except ValueError: print('Non-numeric input detected.') except ImportError: print('Unable to locate the module.') except EOFError: print('Identified EOF error.') except KeyboardInterrupt: print('Wrong keyboard input.') except: print('An error occurred.')
Резюме — Как лучше всего использовать Try-Except в Python
Во время программирования, ошибки неизбежны. Это факт, который никто не может игнорировать. И может быть много причин для ошибок, таких как неправильный ввод данных пользователем, недостаточные права доступа к файлам, недоступность сетевого ресурса, недостаток памяти или, скорее всего, ошибка программиста.
В любом случае, все это может быть обработано, если ваш код использует обработку исключений и реализует ее с помощью таких конструкций, как try-except или try-except-else, try-except-finally.
Python | Обработка исключений
Обработка исключений
Последнее обновление: 27.04.2017
При программировании на Python мы можем столкнуться с двумя типами ошибок. Первый тип представляют синтаксические ошибки (syntax error). Они появляются в результате нарушения синтаксиса
языка программирования при написании исходного кода. При наличии таких ошибок программа не может быть скомпилирована. При работе в какой-либо среде разработки, например, в
PyCharm, IDE сама может отслеживать синтаксические ошибки и каким-либо образом их выделять.
Второй тип ошибок представляют ошибки выполнения (runtime error). Они появляются в уже скомпилированной программе в процессе ее выполнения. Подобные ошибки еще называются исключениями. Например, в прошлых темах мы рассматривали преобразование числа в строку:
string = "5" number = int(string) print(number)
Данный скрипт успешно скомпилируется и выполнится, так как строка «5» вполне может быть конвертирована в число. Однако возьмем другой пример:
string = "hello" number = int(string) print(number)
При выполнении этого скрипта будет выброшено исключение ValueError, так как строку «hello» нельзя преобразовать в число. С одной стороны, здесь очевидно, сто строка не представляет число, но мы можем иметь дело с вводом пользователя, который также может ввести не совсем то, что мы ожидаем:
string = input("Введите число: ") number = int(string) print(number)
При возникновении исключения работа программы прерывается, и чтобы избежать подобного поведения и обрабатывать исключения в Python есть конструкция
try. .except, которая имеет следующее формальное определение:
try: инструкции except [Тип_исключения]: инструкции
Весь основной код, в котором потенциально может возникнуть исключение, помещается после ключевого слова try. Если в этом коде генерируется исключение, то работа кода в блоке try прерывается, и выполнение переходит в блок except.
После ключевого слова except опционально можно указать, какое исключение будет обрабатываться (например, ValueError или KeyError). После слова except на следующей стоке идут инструкции блока except, выполняемые при возникновении исключения.
Рассмотрим обработку исключения на примере преобразовании строки в число:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except: print("Преобразование прошло неудачно") print("Завершение программы")
Вводим строку:
Введите число: hello Преобразование прошло неудачно Завершение программы
Как видно из консольного вывода, при вводе строки вывод числа на консоль не происходит, а выполнение программы переходит к блоку except.
Вводим правильное число:
Введите число: 22 Введенное число: 22 Завершение программы
Теперь все выполняется нормально, исключение не возникает, и соответственно блок except не выполняется.
В примере выше обрабатывались сразу все исключения, которые могут возникнуть в коде. Однако мы можем конкретизировать тип обрабатываемого исключения, указав его после слова except:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError: print("Преобразование прошло неудачно") print("Завершение программы")
Если ситуация такова, что в программе могут быть сгенерированы различные типы исключений, то мы можем их обработать по отдельности, используя дополнительные выражения except:
try: number1 = int(input("Введите первое число: ")) number2 = int(input("Введите второе число: ")) print("Результат деления:", number1/number2) except ValueError: print("Преобразование прошло неудачно") except ZeroDivisionError: print("Попытка деления числа на ноль") except Exception: print("Общее исключение") print("Завершение программы")
Если возникнет исключение в результате преобразования строки в число, то оно будет обработано блоком except ValueError
.
Если же второе число будет равно нулю, то есть будет деление на ноль, тогда возникнет исключение ZeroDivisionError, и оно будет обработано блоком
except ZeroDivisionError
.
Тип Exception представляет общее исключение, под которое попадают все исключительные ситуации. Поэтому в данном случае
любое исключение, которое не представляет тип ValueError или ZeroDivisionError, будет обработано в блоке except Exception:
.
Блок finally
При обработке исключений также можно использовать необязательный блок finally. Отличительной особенностью этого блока является то, что он выполняется вне зависимости, было ли сгенерировано исключение:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError: print("Не удалось преобразовать число") finally: print("Блок try завершил выполнение") print("Завершение программы")
Как правило, блок finally применяется для освобождения используемых ресурсов, например, для закрытия файлов.
Получение информации об исключении
С помощью оператора as мы можем передать всю информацию об исключении в переменную, которую затем можно использовать в блоке except:
try: number = int(input("Введите число: ")) print("Введенное число:", number) except ValueError as e: print("Сведения об исключении", e) print("Завершение программы")
Пример некорректного ввода:
Введите число: fdsf Сведения об исключении invalid literal for int() with base 10: 'fdsf' Завершение программы
Генерация исключений
Иногда возникает необходимость вручную сгенерировать то или иное исключение. Для этого применяется оператор raise.
try: number1 = int(input("Введите первое число: ")) number2 = int(input("Введите второе число: ")) if number2 == 0: raise Exception("Второе число не должно быть равно 0") print("Результат деления двух чисел:", number1/number2) except ValueError: print("Введены некорректные данные") except Exception as e: print(e) print("Завершение программы")
При вызове исключения мы можем ему передать сообщение, которое затем можно вывести пользователю:
Введите первое число: 1 Введите второе число: 0 Второе число не должно быть равно 0 Завершение программы
Это хорошая практика, чтобы использовать try-except-else в Python?
В чем причина существования try-except-else?
Блок try
позволяет обрабатывать ожидаемую ошибку. Блок
except
должен перехватывать только те исключения, которые вы готовы обработать. Если вы обработаете неожиданную ошибку, ваш код может сделать что-то не так и скрыть ошибки.
Предложение else
будет выполняться, если не было ошибок, и, не выполняя этот код в блоке try
, вы избежите неожиданной ошибки. Опять же, перехват неожиданной ошибки может скрыть ошибки.
Пример
Например:
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
else:
return something
В наборе «try, except» есть два необязательных пункта, else
и finally
. Так что на самом деле это try-except-else-finally
.
else
будет вычисляться только в том случае, если нет исключения из блока try
. Это позволяет нам упростить более сложный код ниже:
no_error = None
try:
try_this(whatever)
no_error = True
except SomeException as the_exception:
handle(the_exception)
if no_error:
return something
поэтому, если мы сравним else
с альтернативой (которая может создавать ошибки), мы увидим, что она сокращает строки кода, и мы можем иметь более читабельную, ремонтопригодную и менее глючную кодовую базу.
finally
finally
будет выполняться независимо ни от чего, даже если другая строка вычисляется с помощью оператора return.
Разбивкой с псевдо-код
Это может помочь разбить это на части, в самой маленькой возможной форме, которая демонстрирует все функции, с комментариями. Предположим, что этот синтаксически правильный (но не выполняемый, если имена не определены) псевдокод находится в функции.
Например:
try:
try_this(whatever)
except SomeException as the_exception:
handle_SomeException(the_exception)
# Handle a instance of SomeException or a subclass of it.
except Exception as the_exception:
generic_handle(the_exception)
# Handle any other exception that inherits from Exception
# - doesn't include GeneratorExit, KeyboardInterrupt, SystemExit
# Avoid bare `except:`
else: # there was no exception whatsoever
return something()
# if no exception, the "something()" gets evaluated,
# but the return will not be executed due to the return in the
# finally block below.
finally:
# this block will execute no matter what, even if no exception,
# after "something" is eval'd but before that value is returned
# but even if there is an exception.
# a return here will hijack the return functionality. e.g.:
return True # hijacks the return in the else clause above
Это правда, что мы могли бы включить код в блок else
вместо этого в блок try
, где он будет работать, если не будет исключений, но что, если этот код сам вызовет исключение того типа, который мы ловим? Оставив его в блоке try
, можно было бы скрыть эту ошибку.
Мы хотим минимизировать строки кода в блоке try
, чтобы избежать перехвата исключений, которых мы не ожидали, в соответствии с принципом, что если наш код терпит неудачу, мы хотим, чтобы он потерпел неудачу громко. Это лучшая практика .
Насколько я понимаю, исключения-это не ошибки
В Python большинство исключений являются ошибками.
Мы можем просмотреть иерархию исключений с помощью pydoc. Например, в Python 2:
$ python -m pydoc exceptions
или Python 3:
$ python -m pydoc builtins
Даст нам иерархию. Мы видим, что большинство видов Exception
являются ошибками, хотя Python использует некоторые из них для таких вещей, как завершение циклов for
( StopIteration
). это иерархия Python 3:
BaseException
Exception
ArithmeticError
FloatingPointError
OverflowError
ZeroDivisionError
AssertionError
AttributeError
BufferError
EOFError
ImportError
ModuleNotFoundError
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
RecursionError
StopAsyncIteration
StopIteration
SyntaxError
IndentationError
TabError
SystemError
TypeError
ValueError
UnicodeError
UnicodeDecodeError
UnicodeEncodeError
UnicodeTranslateError
Warning
BytesWarning
DeprecationWarning
FutureWarning
ImportWarning
PendingDeprecationWarning
ResourceWarning
RuntimeWarning
SyntaxWarning
UnicodeWarning
UserWarning
GeneratorExit
KeyboardInterrupt
SystemExit
— Спросил комментатор:
Допустим, у вас есть метод, который пингует внешний API, и вы хотите обработать исключение в классе вне оболочки API, вы просто возвращаете e из метода в предложении except, где e — объект исключения?
Нет, вы не возвращаете исключение, просто повторите его с помощью голого raise
, чтобы сохранить трассировку стека.
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
raise
Или, в Python 3, Вы можете создать новое исключение и сохранить обратную дорожку с цепочкой исключений:
try:
try_this(whatever)
except SomeException as the_exception:
handle(the_exception)
raise DifferentException from the_exception
Здесь я подробно останавливаюсь на своем ответе .
try except finally в Python
Позволяет задать обработчики исключений, а также определить код «уборки» для некоторого набора инструкций.
Данная составная инструкция производит обработку исключений для кода, идущего в блоке try.class MyException1(Exception): pass
class MyChildException1(MyException1): passclass MyException2(Exception): pass
class MyChildException2(MyException2): pass
class MyException3(Exception): pass
class MyChildException3(MyException3): pass
def make_exception(exception_type):
try:
raise exception_type()
except MyChildException1:
print('MyChildException1')
except (MyChildException2, MyException3):
print('MyChildException2, MyException3')
except:
print('broad except')
make_exception(MyChildException1) # MyChildException1
make_exception(MyException2) # broad except
make_exception(MyChildException3) # MyChildException2, MyException3
Блок try
- Если в ходе исполнения данного блока исключений не будет, то ни один из обработчиков не задействуется.
- Если в ходе исполнения инструкций в этом блоке будет зафиксировано исключение, то начнётся поиск подходящего для него обработчика. Поиск производится по блокам except поочерёдно, поэтому более широкие типы исключений (базовые) имеет смысл ставить после более узких.
Блок except
Таких блоков может быть несколько и в каждом можно определить свой механизм обработки для того или иного типа исключения (или группы исключений). Все блоки except должны иметь тело, в котором реализуется обработка исключения.
После достижения конца блока исполнение продолжается с места, следующего за всей инструкцией. Из этого следует, что в случае, если существуют обработчики одного и того же исключения вложенные друг в друга, и исключение происходит в теле блока try самого внутреннего, то и обработано оно будет только самым внутренним обработчиком.
- Если блок except используется без следующего за ним выражения, то он должен быть последним, потому что в нём производится обработка любых типов.
- Если за блоком следует выражение, то оно будет выполнено. Если полученным в результате выполнения объект «совместим» с исключением, которые мы собираемся обработать, то будут выполнены инструкции, находящиеся в данном блоке. Объект считается совместимым с поднятым исключением, если является классом (непосредственным, либо базовым) исключения, либо кортежем, содержащим элемент, совместимый с исключением.
- Если в ходе поиска обработчик найден не будет, то поиск будет продолжен среди обработчиков окружающего кода по стеку.
Исключение распространяется по стеку вызова, если только на его пути не встретится блок finally, возбуждающий другое исключение. В этом случае прежнее исключением будет «потеряно» из-за нового.
- Если в ходе выполнения выражения в блоке except будет случится исключение, то поиск обработчика прерывается. При этом начинается поиск нового обработчика в окружающем коде и по стеку вызова. При этом считается, что вся инструкция try except породила исключение.
- Если найден подходящий блок except, то исключению назначается имя указанное после ключевого слова
as
(до +py.2.5 вместо ключевого слова использоваталсь запятая,
). После чего выполняется код в теле блока.
Если вы хотите представить исключение в виде строки, то можете попробовать использовать формат
%r
вместо %s
. Так результирующая строка будет содержать не только текст, переданный в инициализатор, но и название типа исключения.Если исключению назначено имя, то оно будет очищено после исполнения блока except. Так сделано потому, что вместе с прикрепленной к нему трассировкой стека, исключение формирует циклическую ссылку со фреймом стека, где хранятся все локальные переменные до следующей сборки мусора.
try:
raise Exception('arg1', 'arg2')except Exception as e:
print(e)
# >> ('arg1', 'arg2')
Перед исполнением блока except, данные об исключении сохраняются в модуле
sys
и могут быть получены при помощи sys.exc_info()
.До +py2.5 нельзя было использовать except совместно с finally, то есть, существовали две формы инструкции: try ... except
и try ... finally
.
Блок else
Инструкции в этом необязательном блоке выполняются по завершению блока try без исключений, а также без
return
, continue
и break
.def make_exception():try:
return 'try'
except:
return 'except'
else:
return 'else'
make_exception() # 'try'
Блок finally
В этом необязательно блоке можно определить код «уборки». Инструкции из этого блока будут выполнены после выполнения всех прочих блоков, в том числе если исключение не было обработано (в этом случае оно будет возбуждено повторно в конце блока finally автоматически) и если в блоке try присутствуют
return
или break
. При этом информация об исключении недоступна.В существующих реализациях употребление continue
в блоке finally не поддерживается.
Если в блоке имеется инструкция
return
или break
информация об исключении (если оно было) будет утеряна:def make_exception():
try:
1/0finally:
return 'finally'
make_exception() # 'finally'
+py3.0 Если в блоке finally возбуждается новое исключение, то ему в качестве контекста будет назначено прежнее исключение. До -py3.0 в подобных сценариях информация об исключении терялась.
+py3.8 Теперь в блоке finally можно использовать инструкцию continue.
Скорость выполнения
Сама инструкция весьма производительна, если исключения не поднимаются. Дорого обходится непосредственно отлов исключения.
До версии +py2.0 можно было часто видеть конструкцию следующего вида:
try:
value = mydict[key]
except KeyError:
mydict[key] = getvalue(key)
value = mydict[key]
Это имело смысл лишь когда ключ присутствовал в словаре в большинстве случаев.
Иначе код выглядел так:
if key in mydict:
value = mydict[key]
else:
value = mydict[key] = getvalue(key)
В данном конкретном примере можно было использовать
value = dict.setdefault(key, getvalue(key))
, но только если вызов getvalue()
достаточно дёшев (поскольку значение в любом случае будет вычислено).goto
Использовать описанный ниже подход следует в случаях насущной необходимости, без фанатизма.
При помощи инструкции можно соорудить достаточно функциональное подобие go
и goto
из других языков программирования.
class label(Exception): pass # метка для gototry:
...
if condition: raise label() # переход к метке
...
except label: # реализация по метке
pass
...
Этот подход не даст перейти внутрь цикла, но обычно подобное и не требуется, так как считается плохим применением
goto
. Обработка ошибок с помощью Python—ArcGIS Pro
Ошибки случаются. Написание скриптов, которое предполагает наличие и обработку ошибок, сохраняет массу времени и ваших сил. Когда инструмент выводит сообщение об ошибке, ArcPy генерирует системную ошибку или исключение. В Python вы можете обеспечить различные структуры и методы для обработки исключений. Конечно, скрипт может не выполниться по причинам, не связанным с инструментом геообработки. Их также следует обнаружить и решить. В следующих разделах предлагаются несколько методов, которые знакомят вас с основами обработки исключений в Python.
Когда инструмент записывает сообщение об ошибке, ArcPy создает исключение arcpy.ExecuteError. Python позволяет написать модуль, который будет запускаться автоматически при возникновении системной ошибки. С помощью этого модуля для обработки ошибок вы сможете получать сообщения об ошибках от ArcPy и реагировать на них. Если скрипт не имеет модуля для обработки ошибок, он завершает выполнение немедленно, что уменьшает его надежность. Модуль обработки ошибок можно использовать для управления ошибками и повышения надежности скриптов.
Сообщения об ошибках в инструментах геообработки обычно имеют шестизначный код. Эти коды-идентификаторы занесены в документы, содержащие дополнительные сведения об их причинах и необходимых действиях.
Выражение try-except
Выражение try-except может быть использовано для разделения программы на шаги, чтобы контролировать выполнение каждого из них и определять места возникновения ошибок. Если ошибка случается внутри выражения try, вызывается исключение и выполняется код в выражении except. Использование выражения except является наиболее простой формой обработки ошибок.
В следующем коде Буфер прекращает работу из-за того, что не был указан обязательный параметр buffer_distance_or_field. Вместо завершения без объяснения причин, выражение except используется для поиска ошибки, ее перехвата и вывода сообщения об ошибке, созданной инструментом Буфер. Обратите внимание, что блок except выполняется только в случае, если в инструменте Буфер происходит ошибка.
import arcpy
import sys
try:
# Execute the Buffer tool
arcpy.Buffer_analysis("c:/transport/roads.shp", "c:/transport/roads_buffer.shp")
except Exception:
e = sys.exc_info()[1]
print(e.args[0])
# If using this code within a script tool, AddError can be used to return messages
# back to a script tool. If not, AddError will have no effect.
arcpy.AddError(e.args[0])
Выражение try содержит дополнительный оператор finally, использующийся для задач, которые должны выполняться в любом случае, вне зависимости от появления исключения. В следующем примере дополнительный модуль ArcGIS 3D Analyst включается в оператор finally, что обеспечивает постоянное включение модуля.
class LicenseError(Exception):
pass
import arcpy
try:
if arcpy.CheckExtension("3D") == "Available":
arcpy.CheckOutExtension("3D")
else:
# Raise a custom exception
raise LicenseError
arcpy.env.workspace = "D:/GrosMorne"
arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300)
arcpy.Aspect_3d("WesternBrook", "westbrook_aspect")
except LicenseError:
print "3D Analyst license is unavailable"
except arcpy.ExecuteError:
print(arcpy.GetMessages(2))
finally:
# Check in the 3D Analyst extension
arcpy.CheckInExtension("3D")
Выражение raise
Предыдущий пример иллюстрирует ошибку в исключении, которое возникло в коде В некоторых случаях может потребоваться создать пользовательские исключения. Для этой цели может быть использовано выражение raise. В следующем коде, выражение raise используется, когда входной класс пространственных объектов определяется как не содержащий объектов. Это не обязательно ошибка, но условие, при котором код может быть использован.
class NoFeatures(Exception):
pass
import arcpy
import os
import sys
arcpy.env.overwriteOutput = True
fc = arcpy.GetParameterAsText(0)
try:
# Check that the input has features
result = arcpy.GetCount_management(fc)
if int(result[0]) > 0:
arcpy.FeatureToPolygon_management(
fc, os.path.join(os.path.dirname(fc), 'out_poly.shp'))
else:
# Raise custom exception
raise NoFeatures(result)
except NoFeatures:
# The input has no features
print('{} has no features'.format(fc))
except:
# By default any other errors will be caught here
e = sys.exc_info()[1]
print(e.args[0])
Класс ExecuteError
Если выполнение инструмента геообработки прерывается, то появляется класс исключений arcpy.ExecuteError, это означает, что вы можете разделить ошибки на различные группы, ошибки геообработки (они вызывают исключение arcpy.ExecuteError) и другие типы ошибок. Затем можно обрабатывать эти ошибки по разному, как показано в следующем коде:
import arcpy
import sys
try:
result = arcpy.GetCount_management("C:/invalid.shp")
# Return geoprocessing specific errors
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessages(2))
# Return any other type of error
except:
# By default any other errors will be caught here
e = sys.exc_info()[1]
print(e.args[0])
traceback
В больших и более сложных скриптах бывает сложно точное определить место возникновения ошибки. Модули Python sys и traceback могут быть использованы вместе для определения точного расположения и причины появления ошибки, определения самой ошибки более точным образом и экономят время при отладке скрипта.
# Import the required modules
#
import arcpy
import sys
import traceback
arcpy.env.workspace = "C:/Data/myData.gdb"
try:
arcpy.CreateSpatialReference_management()
#--------------------------
# Your code goes here
#
# See the table below for examples
#--------------------------
except arcpy.ExecuteError:
# Get the tool error messages
msgs = arcpy.GetMessages(2)
# Return tool error messages for use with a script tool
arcpy.AddError(msgs)
# Print tool error messages for use in Python/PythonWin
print(msgs)
except:
# Get the traceback object
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
# Concatenate information together concerning the error into a message string
pymsg = "PYTHON ERRORS:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
msgs = "ArcPy ERRORS:\n" + arcpy.GetMessages(2) + "\n"
# Return python error messages for use in script tool or Python window
arcpy.AddError(pymsg)
arcpy.AddError(msgs)
# Print Python error messages for use in Python / Python window
print(pymsg)
print(msgs)
Если вышеуказанный код будет использован, и в нем возникнет ошибка геообработки, такая как некорректные входные данные, это вызовет arcpy.ExecuteError, и будет использовано первое выражение except. Это выражение выведет сообщение об ошибке с помощью функции GetMessages. Если в коде возникнет ошибка другого типа, будет использовано второе выражение except. Вместо вывода сообщения о процессе геообработки, будет получен объект traceback и выведено подходящее сообщение о соответствующей системной ошибке.
В таблице ниже показаны ожидаемые ошибки, являющиеся результатом трех различных строк кода, который мог быть использован вместо вышеуказанного кода. Первый пример – ошибка инструмента геообработки, которая генерирует информацию traceback и сообщения об ошибках геообработки. Второй и третий примеры не обрабатываются, а происходит только генерация данных traceback.
Ваш код | Результирующая ошибка |
---|---|
arcpy.GetCount_management(«») |
|
x = «a» + 1 |
|
float(«a text string») |
|
Получение сообщений об ошибках от объекта Result
Краткая информация об объекте Result, показанном ниже:
result = arcpy.GetCount_management("c:/data/rivers.shp")
Если при вызове GetCount_management выдается исключение, объект Result не создается. Это означает, что вы не сможете получать сообщения об ошибках от объекта Result.
import arcpy
try:
result = arcpy.GetCount_management("c:/data/rivers.shp")
# Return Geoprocessing specific errors
# (this method is incorrect!)
except arcpy.ExecuteError:
arcpy.AddError(result.getMessages(2))
Выполнение представленного выше кода прерывается с сообщением name ‘result’ is not defined. Это связано с тем, что объект Result не создается из-за ошибки инструмента. Поскольку объект Result не создается, при попытке использования метода getMessages возникает ошибка Python.
Объект Result, создаваемый посредством службы геообработки в ArcGIS Server, создается даже при ошибке инструмента. Объект Result не создается только тогда, когда инструмент запускается локально и выдает ошибку. Более подробную информацию об использовании объекта result смотрите в разделе Использование инструментов в Python.
Отзыв по этому разделу?
Работа с исключениями try/except/else/finally — Документация Python для сетевых инженеров 3.0
try/except
Если вы повторяли примеры, которые использовались ранее, то наверняка были ситуации, когда выскакивала ошибка. Скорее всего, это была ошибка синтаксиса, когда не хватало, например, двоеточия.
Как правило, 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 можно не указывать конкретное исключение или исключения. В таком случае будут перехватываться все исключения.
Это делать не рекомендуется!
Когда использовать исключения
Как правило, один и тот же код можно написать и с использованием исключений, и без них.
Например, этот вариант кода:
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 это не так. Чтобы немного больше разобраться с этим вопросом, посмотрите ссылки на дополнительные материалы в конце этого раздела.
Обработка исключений в Python: отладка кода и перехват ошибок (try-except)
Иногда, во время работы программы случаются непредвиденные ситуации. Например, попытка поделить число на ноль или чтение несуществующего файла вызовут ошибку и остановят выполнение программы. Такие ситуации в программировании называют исключительными ситуациями, а ошибки — исключениями (exception). Для разных ситуаций есть свои типы исключений:
2 / 0
open('non_existing_file.txt')
Как вы могли заметить, названия исключений довольно точно описывают причину возникновения ошибки. Это часть плана: исключения нужны для того, чтобы рассказать программисту что произошло. Однако, когда выбрасывается исключение, вместе с его типом на экран выводится ещё целая куча сопутствующей информации. Давайте рассмотрим такой пример:
def average(numbers):
return sum(numbers) / len(numbers)
average([1, 2, 3])
average([])
Выйдет такая ошибка:
Traceback (most recent call last): # 6
File "example.py", line 5, in <module> # 5
average([]) # 4
File "example.py", line 2, in average # 3
return sum(numbers) / len(numbers) # 2
ZeroDivisionError: division by zero # 1
Простыня текста на последних шести строчках называется трэйсбэком. Он выглядит страшно, но читать его — полезно. В нём Python рассказывает что же случилось.
Важно: трейсбек читают снизу вверх. Именно поэтому мы расставили такую нумерацию строчек в примере.
Давайте разберём каждую строчку в примере выше:
1) ZeroDivisionError: division by zero
— тип исключения и сообщение с причиной ошибки. Если перевести на русский, сразу понятно: ОшибкаДеленияНаНоль: вы поделили на ноль.
2) return sum(numbers) / len(numbers)
— строка, на которой произошла ошибка.
3) File "example.py", line 2, in average
— где эту строку искать. В файле example.py
, на второй строке, в функции average
.
4 и 5) Начиная с этой строки и далее, Python будет указывать какие строки кода исполнялись до момента, с которого началась вся цепочка. Эта информация нужна, когда ошибка произошла где-то внутри чужого кода. Просматривая трейсбэк снизу вверх, можно найти строчку вашего кода, которая стала причиной ошибки.
6) Начало трейсбэка
Каким бы длинным трейсбек ни был, в большинстве случаев вам понадобится только последние две-три строки. Как правило, их достаточно, чтобы определить что и где произошло. Выходит, трейсбэки не такие уж и страшные, если знать, где искать.
Если возникшее исключение — часть плана или вы хотите обработать его особенном образом, то на такой случай в Python существует конструкция try-except
:
filepath = user.get_avatar_filepath()
try:
avatar = Image.open(filepath)
except FileNotFoundError:
avatar = default_avatar
Внутри блока try
(внутри — это с отступами) пишется код, который потенциально может вызвать ошибку. Если исключения не произойдёт, то Python проигнорирует блок except
и пойдёт дальше. Если же возникла ошибка — сработает код внутри блока except
.
Обратите внимание, что после except
стоит тип исключения, который может случиться внутри try
. Это правило хорошего тона. Мы явно указываем тип ошибки, которую ожидаем.
Код, в котором не указан тип ошибки выглядит так:
filepath = user.get_avatar_filepath()
try:
avatar = use_avatar(filepath)
except:
avatar = default_avatar
Однажды может случится страшное: другая ошибка. Но код будет себя вести так, будто ничего страшного не произошло, будто он просто не нашёл файл. Python не покажет трейсбек и чинить код придется методом ненаучного тыка.
Когда разработчик не указывает тип исключения, кажется, будто он просто написал такой плохой код, что сам себе не доверяет. Без особой необходимости так делать нельзя.
Python Попробуйте, кроме
Блок try
позволяет протестировать
блок кода ошибок.
Блок кроме
позволяет
обработать ошибку.
Блок finally
позволяет
выполнить код независимо от результата блоков try- и except.
Обработка исключений
Когда возникает ошибка или исключение, как мы это называем, Python обычно останавливается и генерировать сообщение об ошибке.
Эти исключения можно обработать с помощью оператора try
:
Пример
Блок try
сгенерирует исключение,
поскольку x
не определено:
попробуйте:
print (x)
except:
print («Произошло исключение»)
Поскольку блок try вызывает ошибку, блок исключений будет выполнен.
Без блока try программа выйдет из строя и выдаст ошибку:
Пример
Этот оператор вызовет ошибку,
поскольку x
не определено:
печать (x)
Попробуй сам »Множество исключений
Вы можете определить столько блоков исключений, сколько захотите, например.грамм. если вы хотите выполнить специальный блок кода для особого вида ошибки:
Пример
Вывести одно сообщение, если блок try вызывает NameError
и другое
для других ошибок:
попробуйте:
print (x)
except NameError:
print («Переменная x
не определено «)
за исключением:
print (» Что-то еще пошло
неправильно «)
Остальное
Вы можете использовать ключевое слово else
для определения
блок кода, который будет выполнен, если ошибок не возникло:
Пример
В этом примере блок try
не
генерировать любую ошибку:
попробуйте:
print («Привет»)
except:
print («Что-то пошло
неправильно «)
else:
print (» Ничего не случилось «)
Наконец
Будет выполнен блок finally
, если он указан
независимо от того, блок попыток
выдает ошибку или нет.
Пример
попробуйте:
print (x)
except:
print («Что-то пошло
неправильно «)
наконец:
print (» Попытка, кроме «завершена»)
Это может быть полезно для закрытия объектов и очистки ресурсов:
Пример
Попытайтесь открыть и записать в файл, который недоступен для записи:
попробуйте:
f = open («demofile.txt»)
f.write («Lorum Ipsum»)
за исключением:
print («Что-то пошло
неправильно при записи в файл «)
наконец:
ф.закрыть ()
Программа может продолжаться, не оставляя файловый объект открытым.
Вызов исключения
Как разработчик Python вы можете генерировать исключение при возникновении условия.
Чтобы вызвать (или вызвать) исключение, используйте ключевое слово raise
.
Пример
Вызов ошибки и остановка программы, если x меньше 0:
x = -1, если x <0:
вызывать исключение («К сожалению, ниже нет чисел
ноль «)
Ключевое слово Повышение
используется для повышения
исключение.
Вы можете определить, какую ошибку выдавать, и текст для вывода пользователю.
Пример
Вызывает ошибку TypeError, если x не является целым числом:
x = «hello», если не type (x) is int:
raise TypeError («Только
целые числа разрешены «)
Python Try Except — GeeksforGeeks
Ошибка в Python может быть двух типов: синтаксические ошибки и исключения. Ошибки — это проблемы в программе, из-за которых программа останавливает выполнение.С другой стороны, исключения возникают, когда происходят некоторые внутренние события, которые изменяют нормальный ход программы.
Примечание: Для получения дополнительной информации см. Ошибки и исключения в Python
Некоторые из распространенных ошибок исключения:
- IOError: , если файл не может быть открыт
- KeyboardInterrupt: , когда пользователь нажимает ненужную клавишу.
- ValueError: , когда встроенная функция получает неверный аргумент.
- EOFError: , если достигается конец файла без чтения каких-либо данных.
- ImportError: , если это невозможно. чтобы найти модуль
Try Except в Python
Оператор Try and Except используется для обработки этих ошибок в нашем коде на Python.Блок try используется для проверки некоторого кода на наличие ошибок, т.е. код внутри блока try будет выполняться, когда в программе нет ошибок. В то время как код внутри блока except будет выполняться всякий раз, когда программа обнаруживает ошибку в предыдущем блоке try.
Синтаксис:
попробуйте: # Немного кода Кроме: # Выполняется, если ошибка в # try block
Как работает try ()?
- Сначала выполняется предложение try i.е. код между попробуйте и , за исключением пункта .
- Если нет исключения, то будет выполняться только предложение try , , за исключением предложения , завершено.
- Если возникнет какое-либо исключение, предложение try будет пропущено и будет выполнено предложение за исключением .
- Если возникает какое-либо исключение, но предложение except в коде его не обрабатывает, оно передается во внешние операторы try . Если исключение осталось необработанным, выполнение останавливается.
- Оператор try может иметь более одного , за исключением предложения
Код 1: Без исключения, поэтому будет выполнено предложение try .
Python
/ / y 9000Er 0003 |
/ / y 9000Er 0003 |
|
.0 Выход: -9000,0 a / b приводит к 0
finally Ключевое слово в Python
Python предоставляет ключевое слово finally, которое всегда выполняется после блоков try и except. Последний блок всегда выполняется после нормального завершения блока try или после завершения блока try из-за некоторых исключений.
Синтаксис:
попробуйте: # Немного кода Кроме: # Выполняется, если ошибка в # попробуйте заблокировать еще: # выполнить, если нет исключения наконец-то: # Некоторый код ..... (всегда выполняется)
Код:
Python3
|
Вывод:
Нельзя делить на ноль Это всегда выполняется
Статьи по теме:
Эта статья предоставлена Mohit Gupta_OMG 😀 .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS . И чтобы начать свое путешествие по машинному обучению, присоединяйтесь к Машинное обучение — курс базового уровня
Введение — Real Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. SyntaxError: недопустимый синтаксис
Стрелка указывает, где синтаксический анализатор обнаружил синтаксическую ошибку .В этом примере одной скобки слишком много. Удалите его и снова запустите свой код:
>>> печать (0/0)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
ZeroDivisionError: целочисленное деление или по модулю нуля
На этот раз вы столкнулись с ошибкой исключения . Этот тип ошибки возникает всякий раз, когда синтаксически правильный код Python приводит к ошибке. В последней строке сообщения указано, с каким типом ошибки исключения вы столкнулись.
Вместо того, чтобы показывать сообщение ошибка исключения
, Python детализирует, какой тип ошибки исключения был обнаружен. В данном случае это была ошибка ZeroDivisionError
. Python поставляется с различными встроенными исключениями, а также с возможностью создавать самоопределяемые исключения.
Возникновение исключения
Мы можем использовать raise
, чтобы генерировать исключение в случае возникновения условия. Заявление можно дополнить настраиваемым исключением.
Если вы хотите выдать ошибку при возникновении определенного условия, используя поднять
, вы можете сделать это следующим образом:
х = 10
если x> 5:
Raise Exception ('x не должно превышать 5.Значение x было: {} '. Format (x))
Когда вы запустите этот код, вы получите следующий результат:
Traceback (последний звонок последний):
Файл "", строка 4, в
Исключение: x не должно превышать 5. Значение x было: 10.
Программа останавливается и отображает наше исключение на экране, предлагая подсказки о том, что пошло не так.
Ошибка
AssertionError
Исключение Вместо того, чтобы ждать, пока программа выйдет из строя на полпути, вы также можете начать с утверждения на Python.Мы утверждаем
, что определенное условие выполнено. Если это условие оказывается равным True
, то это отлично! Программа может продолжаться. Если условие оказывается False
, программа может выдать исключение AssertionError
.
Взгляните на следующий пример, где утверждается, что код будет выполняться в системе Linux:
импортных систем
assert ('linux' в sys.platform), «Этот код работает только в Linux."
Если вы запустите этот код на машине Linux, утверждение пройдет. Если бы вы запустили этот код на машине Windows, результатом утверждения было бы False
, и результат был бы следующим:
Traceback (последний звонок последний):
Файл "", строка 2, в
AssertionError: этот код работает только в Linux.
В этом примере выброс исключения AssertionError
— это последнее, что программа сделает.Программа будет остановлена и не будет продолжаться. Что, если это не то, что вам нужно?
пытаются
и кроме
Блок: обработка исключений Блок try
и except
в Python используется для перехвата и обработки исключений. Python выполняет код, следующий за оператором try
, как «нормальную» часть программы. Код, следующий за оператором except
, является ответом программы на любые исключения в предыдущем предложении try
.
Как вы видели ранее, когда синтаксически правильный код вызывает ошибку, Python выдает ошибку исключения. Эта ошибка исключения приведет к сбою программы, если она не будет обработана. Предложение except
определяет, как ваша программа реагирует на исключения.
Следующая функция может помочь вам понять попробуйте
и , кроме блока
:
def linux_interaction ():
assert ('linux' в sys.platform), «Функция может работать только в системах Linux."
print ('Делаю что-то.')
linux_interaction ()
может работать только в системе Linux. assert
в этой функции вызовет исключение AssertionError
, если вы вызовете его в операционной системе, отличной от Linux.
Вы можете дать функции попробовать
, используя следующий код:
попробуйте:
linux_interaction ()
Кроме:
проходить
Здесь вы обработали ошибку, раздав проход
.Если бы вы запустили этот код на машине Windows, вы бы получили следующий результат:
У вас ничего нет. Здесь хорошо то, что программа не вылетела. Но было бы неплохо увидеть, возникало ли какое-либо исключение всякий раз, когда вы запускали свой код. С этой целью вы можете изменить проход
на что-то, что будет генерировать информативное сообщение, например:
попробуйте:
linux_interaction ()
Кроме:
print ('Функция Linux не была выполнена')
Выполните этот код на машине Windows:
Функция Linux не была выполнена
Когда в программе, выполняющей эту функцию, возникает исключение, программа продолжит работу, а также сообщит вам о том, что вызов функции не был успешным.
Вы не смогли увидеть тип ошибки, возникшей в результате вызова функции. Чтобы точно увидеть, что пошло не так, вам нужно будет поймать ошибку, которую выдала функция.
Следующий код представляет собой пример, в котором вы фиксируете AssertionError
и выводите это сообщение на экран:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
print ('Функция linux_interaction () не была выполнена')
Запуск этой функции на машине Windows дает следующее:
Функция может работать только в системах Linux.Функция linux_interaction () не была выполнена
Первое сообщение — это AssertionError
, информирующее вас о том, что функция может быть выполнена только на машине Linux. Второе сообщение сообщает вам, какая функция не была выполнена.
В предыдущем примере вы вызвали функцию, которую написали сами. При выполнении функции вы перехватили исключение AssertionError
и распечатали его на экране.
Вот еще один пример, когда вы открываете файл и используете встроенное исключение:
попробуйте:
с открытым ('файл.log ') как файл:
read_data = file.read ()
Кроме:
print ('Не удалось открыть файл.log')
Если file.log не существует, этот блок кода выведет следующее:
Это информационное сообщение, и наша программа продолжит работу. В документации Python вы можете видеть, что существует множество встроенных исключений, которые вы можете использовать здесь. Одно исключение, описанное на этой странице, следующее:
Исключение
FileNotFoundError
Возникает, когда файл или каталог запрашиваются, но не существуют.Соответствует ошибке ENOENT.
Чтобы перехватить этот тип исключения и вывести его на экран, вы можете использовать следующий код:
попробуйте:
с open ('file.log') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
В этом случае, если file.log не существует, вывод будет следующим:
[Errno 2] Нет такого файла или каталога: 'file.log'
Вы можете иметь более одного вызова функции в предложении try
и ожидать перехвата различных исключений.Здесь следует отметить, что код в предложении try
останавливается, как только возникает исключение.
Предупреждение: Перехват Исключение
скрывает все ошибки… даже совершенно неожиданные. Вот почему вам следует избегать голых , за исключением
, в ваших программах на Python. Вместо этого вам нужно обратиться к конкретным классам исключений , которые вы хотите перехватывать и обрабатывать. Вы можете узнать больше о том, почему это хорошая идея, в этом руководстве.
Посмотрите на следующий код. Здесь вы сначала вызываете функцию linux_interaction ()
, а затем пытаетесь открыть файл:
попробуйте:
linux_interaction ()
с open ('file.log') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
кроме AssertionError как ошибки:
печать (ошибка)
print ('Функция Linux linux_interaction () не была выполнена')
Если файл не существует, запуск этого кода на машине Windows выдаст следующее:
Функция может работать только в системах Linux.Функция Linux linux_interaction () не была выполнена
Внутри предложения try
вы сразу же столкнулись с исключительной ситуацией и не дошли до той части, где пытаетесь открыть file.log . Теперь посмотрим, что происходит, когда вы запускаете код на машине Linux:
[Errno 2] Нет такого файла или каталога: 'file.log'
Вот основные выводы:
- Предложение
try
выполняется до момента, когда встречается первое исключение. - Внутри предложения
except
или обработчика исключений вы определяете, как программа реагирует на исключение. - Вы можете предвидеть несколько исключений и различать, как программа должна на них реагировать.
- Избегайте использования
, за исключением пунктов
.
иначе
Пункт В Python с помощью оператора else
можно указать программе выполнить определенный блок кода только при отсутствии исключений.
Посмотрите на следующий пример:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
print ('Выполнение предложения else.')
Если бы вы запустили этот код в системе Linux, результат был бы следующим:
Что-то делать.
Выполнение предложения else.
Поскольку программа не вызвала никаких исключений, было выполнено предложение else
.
Вы также можете попробовать
, чтобы запустить код внутри предложения else
и также перехватить возможные исключения:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
пытаться:
с открытым ('файл.log ') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
Если бы вы выполнили этот код на машине Linux, вы бы получили следующий результат:
Что-то делать.
[Errno 2] Нет такого файла или каталога: 'file.log'
Из выходных данных видно, что функция linux_interaction ()
была запущена. Поскольку никаких исключений не обнаружено, была сделана попытка открыть файл file.log .Этот файл не существует, и вместо его открытия вы поймали исключение FileNotFoundError
.
Очистка после использования
наконец
Представьте, что вам всегда приходилось выполнять какое-то действие для очистки после выполнения вашего кода. Python позволяет сделать это с помощью предложения finally
.
Взгляните на следующий пример:
попробуйте:
linux_interaction ()
кроме AssertionError как ошибки:
печать (ошибка)
еще:
пытаться:
с открытым ('файл.log ') как файл:
read_data = file.read ()
кроме FileNotFoundError как fnf_error:
печать (fnf_error)
наконец-то:
print ('Очистка, независимо от каких-либо исключений.')
В предыдущем коде будет выполнено все, что указано в предложении finally
. Не имеет значения, встретите ли вы исключение где-то в предложениях try
или else
. Выполнение предыдущего кода на компьютере с Windows выдаст следующее:
Функция может работать только в системах Linux.Уборка, независимо от каких-либо исключений.
Подведение итогов
Увидев разницу между синтаксическими ошибками и исключениями, вы узнали о различных способах создания, перехвата и обработки исключений в Python. В этой статье вы видели следующие варианты:
-
Raise
позволяет в любой момент вызвать исключение. -
assert
позволяет проверить, выполняется ли определенное условие, и генерировать исключение, если это не так. - В предложении
try
все операторы выполняются до тех пор, пока не будет обнаружено исключение. -
, за исключением
, используется для перехвата и обработки исключений, обнаруженных в предложении try. -
else
позволяет кодировать разделы, которые должны выполняться только тогда, когда в предложении try не встречаются исключения. -
finally
позволяет вам выполнять разделы кода, которые должны выполняться всегда, с любыми ранее встречавшимися исключениями или без них.
Надеюсь, эта статья помогла вам понять основные инструменты, которые Python может предложить при работе с исключениями.
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Введение в исключения Python
Обработка исключений Python Использование оператора try, except и finally
Исключения в Python
Python имеет множество встроенных исключений, которые возникают, когда ваша программа обнаруживает ошибку (что-то в программе идет не так).
Когда возникают эти исключения, интерпретатор Python останавливает текущий процесс и передает его вызывающему процессу до тех пор, пока он не будет обработан.Если не обработать, программа выйдет из строя.
Например, давайте рассмотрим программу, в которой у нас есть функция A
, которая вызывает функцию B
, которая, в свою очередь, вызывает функцию C
. Если исключение возникает в функции C
, но не обрабатывается в C
, исключение переходит в B
, а затем в A
.
Если не обрабатывать, отображается сообщение об ошибке, и наша программа неожиданно останавливается.
Перехват исключений в Python
В Python исключения можно обрабатывать с помощью оператора try
.
Критическая операция, которая может вызвать исключение, помещается в предложение try
. Код, обрабатывающий исключения, записан в разделе за исключением
.
Таким образом, мы можем выбрать, какие операции выполнять после обнаружения исключения. Вот простой пример.
# import module sys для получения типа исключения
import sys
randomList = ['а', 0, 2]
для записи в randomList:
пытаться:
print ("Запись есть", запись)
r = 1 / int (запись)
перерыв
Кроме:
print ("Ой!", sys.exc_info () [0], «произошло.»)
print ("Следующая запись.")
Распечатать()
print ("Обратное значение", entry, "равно", r)
Выход
Запись Ой!произошел. Следующая запись. Запись 0 Ой! произошел. Следующая запись. Запись 2 Обратное 2 равно 0,5
В этой программе мы перебираем значения из списка randomList . Как упоминалось ранее, часть, которая может вызвать исключение, помещается в блок try
.
Если не возникает исключения, блок , за исключением
, пропускается и продолжается нормальный поток (для последнего значения). Но если возникает какое-либо исключение, оно перехватывается блоком , кроме
(первое и второе значения).
Здесь мы печатаем имя исключения, используя функцию exc_info ()
внутри модуля sys
. Мы видим, что a
вызывает ValueError
, а 0
вызывает ZeroDivisionError
.
Поскольку каждое исключение в Python наследуется от базового класса Exception
, мы также можем выполнить указанную выше задачу следующим образом:
# import module sys для получения типа исключения
import sys
randomList = ['а', 0, 2]
для записи в randomList:
пытаться:
print ("Запись есть", запись)
r = 1 / int (запись)
перерыв
кроме исключения как e:
print ("Ой!", e.__class__, «произошло».)
print ("Следующая запись.")
Распечатать()
print ("Обратное значение", entry, "равно", r)
Эта программа имеет тот же вывод, что и вышеприведенная программа.
Перехват особых исключений в Python
В приведенном выше примере мы не упомянули никаких особых исключений в , кроме пункта
.
Это не очень хорошая практика программирования, поскольку она перехватывает все исключения и обрабатывает все случаи одинаково. Мы можем указать, какие исключения должны улавливаться , кроме пункта
.
Предложение try
может иметь любое количество , за исключением предложений
для обработки различных исключений, однако только одно будет выполнено в случае возникновения исключения.
Мы можем использовать кортеж значений, чтобы указать несколько исключений в предложении except. Вот пример псевдокода.
попробуйте:
# сделай что-нибудь
проходить
кроме ValueError:
# обрабатывать исключение ValueError
проходить
except (TypeError, ZeroDivisionError):
# обрабатывать несколько исключений
# TypeError и ZeroDivisionError
проходить
Кроме:
# обрабатывать все остальные исключения
проездной
Вызов исключений в Python
В программировании на Python при возникновении ошибок во время выполнения возникают исключения.Мы также можем вручную вызывать исключения, используя ключевое слово raise
.
При желании мы можем передать значения исключению, чтобы прояснить причину возникновения этого исключения.
>>> поднять KeyboardInterrupt
Отслеживание (последний вызов последний):
...
KeyboardInterrupt
>>> поднять MemoryError ("Это аргумент")
Отслеживание (последний вызов последний):
...
MemoryError: это аргумент
>>> попробуйте:
... a = int (input ("Введите положительное целое число:"))
...если a <= 0:
... поднять ValueError ("Это не положительное число!")
... кроме ValueError as ve:
... печать (ве)
...
Введите положительное целое число: -2
Это не положительное число!
Python попробуйте с предложением else
В некоторых ситуациях вам может потребоваться запустить определенный блок кода, если блок кода внутри try
работал без ошибок. В этих случаях вы можете использовать необязательное ключевое слово else
с оператором try
.
Примечание : Исключения в разделе else не обрабатываются предыдущими разделами except.
Давайте посмотрим на пример:
# программа для печати обратной величины четных чисел
пытаться:
num = int (input ("Введите число:"))
утверждать число% 2 == 0
Кроме:
print («Не четное число!»)
еще:
обратный = 1 / число
печать (обратная)
Выход
Если передать нечетное число:
Введите номер: 1 Не четное число!
Если мы передаем четное число, вычисляется и отображается обратная величина.
Введите число: 4 0,25
Однако, если мы передадим 0, мы получим ZeroDivisionError
, поскольку кодовый блок внутри , иначе
не обрабатывается предшествующим , за исключением
.
Введите число: 0 Отслеживание (последний вызов последний): Файл «<строка>», строка 7, в <модуле> обратный = 1 / число ZeroDivisionError: деление на ноль
Python попробуйте ... наконец
Оператор try
в Python может иметь необязательное предложение finally
.Этот пункт выполняется несмотря ни на что и обычно используется для освобождения внешних ресурсов.
Например, мы можем быть подключены к удаленному центру обработки данных через сеть или работать с файлом или графическим интерфейсом пользователя (GUI).
Во всех этих обстоятельствах мы должны очистить ресурс до того, как программа остановится, независимо от того, успешно она запущена или нет. Эти действия (закрытие файла, графический интерфейс или отключение от сети) выполняются в предложении , наконец,
, чтобы гарантировать выполнение.
Вот пример файловых операций, чтобы проиллюстрировать это.
попробуйте:
f = open ("test.txt", encoding = 'utf-8')
# выполнять файловые операции
наконец-то:
f.close ()
Этот тип конструкции гарантирует, что файл будет закрыт, даже если во время выполнения программы возникает исключение.
Python Попробуйте, кроме: Пошаговое руководство
Оператор Python try… except перехватывает исключение. Он используется для проверки кода на наличие ошибки, которая записана в операторе «try».Если обнаружена ошибка, выполняется содержимое блока «except».
Как использовать Try and Except в Python
Вы можете протестировать определенный блок кода, чтобы убедиться, что он работает правильно, прежде чем разрешить выполнение остальной части программы. Например, предположим, что вы написали большой объем нового кода для программы. Прежде чем запускать остальную часть программы, вы должны убедиться, что она работает.
Блокиtry… except позволяют тестировать код и обрабатывать исключение, если оно возникает.Вы можете добавить операторы finally и else для запуска дополнительного кода в зависимости от результата блока try… except.
В этом руководстве мы поговорим о том, как использовать try and except в Python. Мы рассмотрим пример, чтобы вы могли быстро начать использовать try and except.
Обновление Python по ошибкам и исключениям
В Python есть два типа ошибок, с которыми вы можете столкнуться: синтаксические ошибки и исключения.
Синтаксические ошибки Python - это тип ошибки, который возвращается при использовании неправильного синтаксиса.Например, если вы напишете цикл while True без двоеточия в конце, программа сообщит об ошибке.
Когда возникают синтаксические ошибки, они возвращают имя файла, номер строки и индикатор того, где может присутствовать ошибка.
Исключения - это тип ошибки, когда код может иметь правильный синтаксис, но все же содержать проблему. Существует много типов исключений, но некоторые из наиболее распространенных, с которыми вы можете столкнуться, включают: ArithmeticError, ImportError, ZeroDivisionError, NameError и TypeError.
Python try… кроме заявления
Оператор Python try… except запускает код под оператором try. Если этот код не выполняется успешно, программа остановится на строке, которая вызвала ошибку, и запустится код «кроме».
Блок try позволяет проверить блок кода на наличие ошибок. Блок except позволяет вам обработать ошибку с помощью определяемого пользователем ответа.
Вот синтаксис для блока try… except:
попробуйте: ваш код... Кроме: ваш код ...
Вы можете заключить любой допустимый код Python в операторы try или except.
попробуйте… кроме Python Пример
Вот пример синтаксиса для try… except Blocks:
попробуйте: печать (наша переменная) Кроме: print ('Ошибка возвращена')
В приведенном выше примере мы не объявили переменную Python ourVariable , но мы пытаемся использовать ее в нашем блоке try.
Если бы у нас не было блоков try… except в нашем коде, программа вернула бы сообщение об ошибке.Хотя сообщение об ошибке - это нормально во время отладки, обычный пользователь может запутаться, если увидит сообщение об ошибке.
Поскольку у нас есть блоки try… except, наш код знает, что делать при обнаружении ошибки.
Вот результат нашего кода:
Блокиtry… except позволяют аккуратно обрабатывать исключения. Вы также можете реализовать такую функцию, как сохранение исключения в файл журнала, используя такой пакет, как модуль ведения журнала Python. Это позволит вам отслеживать возникшие исключения.
попробуйте… кроме Python: несколько исключений
Вы можете повторить операторы , кроме , для различных типов ошибок, чтобы проверить наличие нескольких исключений. Это полезно, если вы подозреваете, что может возникнуть одно из многих исключений, но не уверены, с каким из них вы столкнетесь.
Вот пример попытки… кроме блоков, которые ищут NameError:
попробуйте: печать (наша переменная) кроме NameError: print ('наша переменная не определена') Кроме: print ('Ошибка возвращена')
В этом случае наш код возвращает ourVariable не определено , потому что наш код возвращает NameError.Мы могли бы добавить больше ошибок, таких как ZeroDivisionError или OSError, в зависимости от кода, который мы тестируем.
Например, вы можете проверить IOError и FileNotFoundError, если хотите открыть файл. Проверка нескольких исключений гарантирует, что ваша программа сможет продолжить работу, даже если при открытии файла, на который вы ссылаетесь, произошла ошибка.
попробуйте… кроме Python: Наконец
Но что, если мы хотим, чтобы сообщение выводилось как при возврате ошибки, так и при отсутствии ошибки? Вот тут и появляется блок , наконец, .Если вы определите предложение finally, его содержимое будет выполняться независимо от того, вызывает ли блок try… except ошибку.
Блоки finally - полезный индикатор того, что ваш код выполнил. Поскольку они не различают, был ли код успешно выполнен, они не так широко используются.
Вот пример:
попробуйте: печать (наша переменная) Кроме: print ('наша переменная не определена') наконец-то: print ('Код был запущен.')
Наша программа возвращает следующее:
наша переменная не определена Код был запущен.
Код в блоке за исключением выполняется, потому что в нашем коде обнаружено исключение (наша переменная не определена). Код в предложении finally также выполняется, потому что наш код завершил работу.
попробуйте… кроме Python: Else
Используя предложение else, вы можете определить код, который будет запускаться в случае, если не возникнут исключения. Это может быть использовано, например, для информирования пользователя об успешном выполнении программы.
Представьте, что вы создаете систему регистрации для игры. Вы можете включить блок try… except… else, чтобы проверить, является ли имя пользователя или адрес электронной почты действительным. Если это не так, будет выполнено предложение except. Если имя пользователя или адрес электронной почты действительны, блок else может быть запущен.
Вот пример:
попробуйте: print ('Тест') Кроме: print ('Возникла проблема.') еще: print ('Проблем нет.')
Наш код возвращает следующее:
Наша программа Python не встречает исключений.В результате выполняется код в операторе else . Оператор else выводит сообщение о том, что с нашим кодом нет проблем.
См. Repl.it из этого руководства:
Заключение
Блокиtry… except упрощают отладку кода Python. Программа пытается запустить код в блоке «попытки». Если это не удается, запускается блок «кроме». Код в операторе «finally» выполняется независимо от того, выполняется ли блок «except».
В этом руководстве мы разобрали, как использовать блоки try… except. Мы обсудили, как использовать , еще и , кроме , для настройки обработки исключений.
Эти блоки могут быть полезны при тестировании существующего кода или написании нового кода. Это гарантирует, что ваша программа работает правильно и не содержит ошибок.
Дополнительные ресурсы по изучению Python можно найти в нашем подробном руководстве «Как изучать Python».
Выбрасывание исключений в Python
Программные приложения не всегда работают идеально.Несмотря на интенсивную отладку и несколько уровней тестирования, приложения все равно не работают. Плохие данные, нарушение сетевого подключения, поврежденные базы данных, нехватка памяти и неожиданные действия пользователя могут помешать нормальной работе приложения. Когда такое событие происходит, и приложение не может продолжить нормальный поток, это называется исключением . И задача вашего приложения - и ваша работа как программиста - аккуратно вылавливать и обрабатывать эти исключения, чтобы ваше приложение продолжало работать.
Что такое исключения Python?
Исключения в приложениях Python могут возникать по многим причинам, указанным выше, и по многим другим; и если они не обрабатываются должным образом, эти исключения могут вызвать сбой программы, что приведет к потере данных или, что еще хуже, к повреждению данных. Как разработчику Python вам необходимо подумать о возможных исключительных ситуациях и включить обработку ошибок в свой код.
К счастью, Python поставляется с надежной структурой обработки ошибок. Используя структурированную обработку исключений и набор предопределенных исключений, программы Python могут определять тип ошибки во время выполнения и действовать соответствующим образом.Сюда могут входить такие действия, как выбор альтернативного пути, использование значений по умолчанию или запрос правильного ввода.
Эта статья покажет вам, как вызывать исключения в вашем коде Python и как обрабатывать исключения.
Разница между синтаксическими ошибками Python и исключениями Python
Прежде чем углубляться в детали, важно понять два типа нежелательных условий в программировании на Python - синтаксическая ошибка и исключение .
Исключение синтаксической ошибки возникает, когда код не соответствует ключевым словам Python, стилю именования или структуре программирования.Интерпретатор обнаруживает недопустимый синтаксис на этапе синтаксического анализа и вызывает исключение SyntaxError
. Программа останавливается и дает сбой в том месте, где произошла синтаксическая ошибка. Вот почему синтаксические ошибки - это исключения, с которыми невозможно справиться.
Вот пример блока кода с синтаксической ошибкой (обратите внимание на отсутствие двоеточия после условия «если» в скобках):
a = 10
б = 20
если (a
Интерпретатор улавливает ошибку и указывает номер строки.SyntaxError: недопустимый синтаксис Процесс завершен с кодом выхода 1
С другой стороны, исключение возникает, когда код не содержит синтаксической ошибки, но встречается с другими ошибочными ситуациями. Эти условия могут быть рассмотрены в коде - либо в текущей функции, либо в стеке вызовов. В этом смысле исключения не фатальны. Программа Python может продолжить работу, если она корректно обработает исключение.
Вот пример кода Python, в котором нет синтаксических ошибок.Он пытается выполнить арифметическую операцию с двумя строковыми переменными:
a = 'foo'
b = 'бар'
print (a% b)
Возникло исключение TypeError
:
Traceback (последний вызов последним):
Файл test.py ", строка 4, в
печать (a% b)
TypeError: не все аргументы преобразуются во время форматирования строки
Процесс завершен с кодом выхода 1
Python выдает исключение TypeError
при наличии неправильных типов данных.Подобно TypeError
, есть несколько встроенных исключений, например:
- ModuleNotFoundError
- ImportError
- Ошибка памяти
- Ошибка OS
- Ошибка системы
- ... И так далее
Полный список исключений можно найти в документации Python.
Как создать исключение в Python
Иногда требуется, чтобы Python генерировал настраиваемое исключение для обработки ошибок. Вы можете сделать это, проверив условие и вызвав исключение, если условие истинно.Возникшее исключение обычно предупреждает пользователя или вызывающее приложение.
Ключевое слово raise
используется для создания исключения Python вручную. Вы также можете добавить сообщение с описанием исключения.
Вот простой пример: Предположим, вы хотите, чтобы пользователь ввел дату. Дата должна быть либо сегодня, либо в будущем. Если пользователь вводит прошедшую дату, программа должна вызвать исключение:
Python, пример исключения исключения
from datetime import datetime
current_date = datetime.сейчас()
print ("Текущая дата:" + current_date.strftime ('% Y-% m-% d'))
dateinput = input ("Введите дату в формате гггг-мм-дд:")
"" "Мы не проверяем формат ввода даты здесь" ""
date_provided = datetime.strptime (dateinput, '% Y-% m-% d')
print ("Указанная дата:" + date_provided.strftime ('% Y-% m-% d'))
если (date_provided.date ()
Чтобы проверить код, мы вводим дату, более раннюю, чем текущая дата., если условие
оценивается как истинное и вызывает исключение:
Текущая дата: 2021-01-24
Введите дату в формате гггг-мм-дд: 2021-01-22
Предоставлена дата: 22 января 2021 г.
Отслеживание (последний вызов последний):
Файл "test.py", строка 13, в
поднять исключение ("Указанная дата не может быть в прошлом")
Исключение: указанная дата не может быть в прошлом.
Процесс завершен с кодом выхода 1
Вместо того, чтобы вызывать общее исключение, мы также можем указать для него тип:
...
если (date_provided.date ()
С аналогичным вводом, как и раньше, Python теперь выдаст это исключение:
...
...
Raise ValueError ("Указанная дата не может быть в прошлом")
ValueError: указанная дата не может быть в прошлом
Использование AssertionError в выдаче исключения Python
Другой способ вызвать исключение - использовать утверждение . С помощью assertion вы утверждаете, что условие истинно перед запуском оператора.Если условие истинно, инструкция выполняется, и управление переходит к следующей инструкции. Однако, если условие оценивается как ложное, программа выдает AssertionError
. На диаграмме ниже показан логический поток:
Используя AssertionError
, мы можем переписать фрагмент кода в последнем разделе следующим образом:
from datetime import datetime
current_date = datetime.now ()
print ("Текущая дата:" + current_date.strftime ('% Y-% m-% d'))
dateinput = input ("Введите дату в формате гггг-мм-дд:")
"" "Мы не проверяем формат ввода даты здесь" ""
date_provided = datetime.strptime (dateinput, '% Y-% m-% d')
print ("Указанная дата:" + date_provided.strftime ('% Y-% m-% d'))
assert (date_provided.date ()> = current_date.date ()), «Указанная дата не может быть в прошлом»
Обратите внимание, как мы удалили условие «если» и теперь утверждаем, что указанная дата больше, чем или равно текущей дате. При вводе более старой даты AssertionError
отображает:
Текущая дата: 2021-01-24
Введите дату в формате гггг-мм-дд: 2021-01-23
Отслеживание (последний вызов последний):
Предоставленная дата: 2021-01-23
Файл "test.py ", строка 12, в
assert (date_provided.date ()> = current_date.date ()), «Указанная дата не может быть в прошлом»
AssertionError: указанная дата не может быть в прошлом
Процесс завершен с кодом выхода 1
Перехват исключений Python с помощью Try-Except
Теперь, когда вы понимаете, как создавать исключения в Python вручную, пора посмотреть, как обрабатывать эти исключения. В большинстве современных языков программирования для обработки исключений используется конструкция try-catch
.В Python его основная форма - попыток, кроме
. Блок try-except выглядит так:
Python пример исключения try catch
<программный код>
...
пытаться:
<программный код>
Кроме:
<код обработки исключений>
<программный код>
...
Здесь поток программы входит в блок try
. В случае исключения элемент управления переходит к коду в блоке , кроме блока
. Код обработки ошибок, который вы помещаете в блок за исключением
, зависит от типа ошибки, с которой, по вашему мнению, может столкнуться код в блоке try
.
Вот пример Python try-except
(часто ошибочно называемый «try-catch-exception»). Допустим, мы хотим, чтобы наш код запускался только в том случае, если версия Python - 3. Использование простого утверждения в коде выглядит так:
import sys
assert (sys.version_info [0] == 3), «Версия Python должна быть 3»
Если версия Python отличается от 3, сообщение об ошибке выглядит следующим образом:
Traceback (последний вызов последним):
Файл "test.py", строка 2, в
assert (sys.version_info [0] == 3), "Версия Python должна быть 3"
AssertionError: версия Python должна быть 3
Процесс завершен с кодом выхода 1
Вместо того, чтобы позволить программе выйти из строя с необработанным исключением и показать уродливое сообщение об ошибке, мы могли бы использовать блок try-except
для плавного выхода.
импортных систем
пытаться:
assert (sys.version_info [0] == 3), «Версия Python должна быть 3»
кроме исключения как e:
print (e)
Теперь сообщение об ошибке намного чище:
Ключевое слово except
в конструкции также принимает тип ошибки, которую вы хотите обработать.Чтобы проиллюстрировать это, вернемся к нашему сценарию даты из последнего раздела. В этом сценарии мы предполагали, что пользователь вводит дату в формате «ГГГГ-ММ-ДД».
Однако, как разработчик, вы должны учитывать любой тип ошибочных данных, а не зависеть от пользователя. Например, некоторые сценарии исключения могут быть такими:
- Дата не указана (пусто)
- Введенный текст
- Введенный номер
- Введенное время
- Введены специальные символы
- Введен другой формат даты (например, «дд / мм / гггг»)
Чтобы учесть все эти условия, мы можем переписать блок кода, как показано ниже.Это перехватит любое исключение ValueError
, возникшее при выполнении любого из вышеуказанных условий:
from datetime import datetime
current_date = datetime.now ()
print ("Текущая дата:" + current_date.strftime ('% Y-% m-% d'))
dateinput = input ("Введите дату в формате гггг-мм-дд:")
пытаться:
date_provided = datetime.strptime (dateinput, '% Y-% m-% d')
кроме ValueError как e:
печать (е)
выход()
print ("Указанная дата:" + date_provided.strftime ('% Y-% m-% d'))
assert (date_provided.date ()> = current_date.date ()), «Указанная дата не может быть в прошлом»
В этом случае программа корректно завершит работу, если дата отформатирована неправильно.
Вы можете включить несколько блоков , кроме
, для блока try
для перехвата различных типов исключений. Каждый блок , кроме
, будет адресовать определенный тип ошибки:
...
пытаться:
<программный код>
кроме <Тип исключения 1>:
<код обработки исключений>
кроме <Тип исключения 2>:
<код обработки исключений>
кроме <Тип исключения 3>:
<код обработки исключений>
...
Вот очень простой пример:
num0 = 10
пытаться:
num1 = input ("Введите 1-е число:")
num2 = input ("Введите 2-е число:")
результат = (int (num1) * int (num2)) / (num0 * int (num2))
кроме ValueError как ve:
печать (ве)
выход()
кроме ZeroDivisionError как zde:
печать (здесь)
выход()
кроме TypeError как te:
печать (te)
выход()
Кроме:
print ('Неожиданная ошибка!')
выход()
print (result)
Мы можем протестировать эту программу с разными значениями:
nter 1st number: 1
Введите 2-е число: 0
деление на ноль
Введите 1-е число:
Введите 2-е число: 6
недопустимый литерал для int () с базой 10: ''
Введите 1-е число: 12.99
Введите 2-е число: 33
недопустимый литерал для int () с базой 10: '12 .99 '
Перехват исключений Python с помощью Try-Except-Else
Следующий элемент в конструкции Python try-except
- else
:
...
пытаться:
<программный код>
кроме <Тип исключения 1>:
<код обработки исключений>
кроме <Тип исключения 2>:
<код обработки исключений>
кроме <Тип исключения 3>:
<код обработки исключений>
...
еще:
<программный код для запуска, если блок "try" не обнаруживает ошибок>
...
Блок else
выполняется, если из блока try
не возникают исключения. Глядя на структуру кода выше, вы можете увидеть, что else
в обработке исключений Python работает почти так же, как конструкция if-else
.
Чтобы показать, как работает else
, мы можем немного изменить код арифметического скрипта из последнего раздела. Если вы посмотрите на сценарий, вы увидите, что мы вычислили значение переменной , результат
, используя арифметическое выражение.Вместо того, чтобы помещать это в блок try
, вы можете переместить его в блок else
.
Таким образом, исключение блокирует любую ошибку, возникающую при преобразовании входных значений в целые числа. И если нет исключений, блок else
выполнит фактическое вычисление:
num0 = 10
пытаться:
num1 = int (input ("Введите 1-е число:"))
num2 = int (input ("Введите 2-е число:"))
кроме ValueError как ve:
печать (ве)
выход()
кроме ZeroDivisionError как zde:
печать (здесь)
выход()
кроме TypeError как te:
печать (te)
выход()
Кроме:
print ('Неожиданная ошибка!')
выход()
еще:
результат = (число1 * число2) / (число0 * число2)
print (результат)
Использование простых целых чисел в качестве входных значений запускает код блока else
:
Введите 1-е число: 2
Введите 2-е число: 3
0.2
И использование ошибочных данных, таких как пустые значения, десятичные числа или строки, приводит к запуску соответствующего блока , кроме
, и пропускает блок else
:
Введите 1-е число: s
недопустимый литерал для int () с базой 10: 's'
Введите 1-е число: 20
Введите 2-е число:
недопустимый литерал для int () с базой 10: ''
Введите 1-е число: 5
Введите 2-е число: 6.4
недопустимый литерал для int () с основанием 10: '6.4'
Однако все еще существует возможность необработанных исключений, когда выполняется блок else
:
Введите 1-е число: 1
Введите 2-е число: 0
Отслеживание (последний вызов последний):
Файл "test.py ", строка 19, в
результат = (число1 * число2) / (число0 * число2)
ZeroDivisionError: деление на ноль
Как видите, оба ввода являются целыми числами (1 и 0), и блок «try» успешно преобразует их в целые числа. Когда выполняется блок else
, мы видим исключение.
Итак, как вы обрабатываете ошибки в блоке else
? Вы угадали - вы можете использовать еще один блок try-except-else
внутри внешнего блока else
:
num0 = 10
пытаться:
num1 = int (input ("Введите 1-е число:"))
num2 = int (input ("Введите 2-е число:"))
кроме ValueError как ve:
печать (ве)
выход()
кроме ZeroDivisionError как zde:
печать (здесь)
выход()
кроме TypeError как te:
печать (te)
выход()
Кроме:
print ('Неожиданная ошибка!')
выход()
еще:
пытаться:
результат = (число1 * число2) / (число0 * число2)
кроме исключения как e:
печать (е)
выход()
еще:
print (result)
Теперь это корректно обрабатывает ошибку деления на ноль:
Введите 1-е число: 1
Введите 2-е число: 0
деление на ноль
Перехват исключений Python с помощью Try-Except-Else-finally
Наконец, у нас есть последний необязательный блок в обработке ошибок Python.И это буквально называется , наконец,
:
Python, попробуйте, наконец, пример
...
пытаться:
<программный код>
кроме <Тип исключения 1>:
<код обработки исключений>
кроме <Тип исключения 2>:
<код обработки исключений>
кроме <Тип исключения 3>:
<код обработки исключений>
...
еще:
<программный код для запуска, если блок "try" не обнаруживает ошибок>
наконец-то:
<программный код, который выполняется независимо от ошибок в блоке "try" или "else">
...
Блок finally
выполняется независимо от того, вызывает ли код блока try
исключение. Если возникнет исключение, будет запущен код в соответствующем блоке за исключением
, а затем будет запущен код в блоке , наконец,
. Если нет исключений, будет запущен код в блоке else
(если есть блок else
), а затем будет запущен код в блоке finally
.
Поскольку код в блоке finally
всегда выполняется, вы хотите сохранить здесь свои коды «очистки», например:
- Запись сообщений о состоянии в файлы журнала
- Обнуление счетчиков, списков, массивов
- Закрытие открытых файлов
- Закрытие подключений к базе данных
- Сброс переменных объекта
- Отключение от сетевых ресурсов
- ... И так далее
Вот пример использования finally
:
попробуйте:
f = open ("testfile.txt", 'r')
кроме FileNotFoundError как fne:
печать (fne)
print ('Создание файла ...')
f = open ("testfile.txt", 'w')
f.write ('2')
еще:
data = f.readline (1)
печать (данные)
наконец-то:
print ('Закрытие файла')
f.close ()
Здесь блок try
пытается открыть файл для чтения. Если файл не существует, блок исключения показывает предупреждающее сообщение, создает файл и добавляет к нему статическое значение «2».Если файл существует, блок else
считывает первую строку своего содержимого и распечатывает ее. Наконец, блок finally
закрывает файл. Это происходит независимо от того, существовал файл изначально или нет.
То, что мы обсуждали до сих пор, можно резюмировать на блок-схеме ниже:
Как Rollbar может помочь в регистрации и отслеживании ошибок Python
Rollbar - это платформа непрерывного улучшения кода для команд разработчиков программного обеспечения. Он предлагает автоматизированный способ регистрации ошибок и неудачных тестов в реальном времени на всех уровнях стека приложений и во всех средах.Это позволяет создать проактивный и автоматический ответ на ошибки приложения. На диаграмме ниже показано, как работает Rollbar:
Rollbar изначально работает с широким спектром языков программирования и фреймворков, включая Python. Разработчики Python могут установить pyrollbar, SDK Rollbar для Python, используя такой инструмент, как pip, импортируя класс Rollbar в код и отправляя исключения Python в Rollbar. Приведенный ниже фрагмент кода показывает, насколько это просто:
import rollbar
штанга.init ('POST_SERVER_ITEM_ACCESS_TOKEN', 'разработчик')
пытаться:
<код>
кроме TypeError:
rollbar.report_message ('Несоответствие типа данных', 'фатальный')
Кроме:
rollbar.report_exc_info ()
Как перехватить все исключения в Python - Stackify
Одна из проблем, с которыми сталкиваются разработчики, - как перехватить все исключения Python. Разработчики часто классифицируют исключения как ошибки кода, которые приводят к ошибкам при запуске программы. Некоторые разработчики до сих пор не умеют различать ошибки и исключения.
В случае разработки приложений Python программа на Python завершается, как только обнаруживает необработанную ошибку. Итак, чтобы установить разницу между ошибками и исключениями, существует два типа ошибок:
- Синтаксические ошибки
- Логические ошибки (исключения)
Во-первых, давайте рассмотрим синтаксические ошибки. Синтаксические ошибки Python вызваны несоблюдением правильной структуры (синтаксиса) языка. Это также известно как ошибка синтаксического анализа.
Вот пример:
>>> age = {
'jj': 2,
'yoyo': 4
}
print (f'JJ is {age [«jj»]} лет .’)
На выходе:
JJ 2 года.
Это простой код без синтаксической ошибки. Затем мы добавим еще одну переменную tomtom:
>>> age = {
'jj': 2,
'yoyo': 4
'tomtom': 6
}
print (f'JJ - это { age [«jj»]} лет.
SyntaxError: недопустимый синтаксис
Как вы заметили, сообщение трассировки не указал точную строку, в которой возникает синтаксическая ошибка.Интерпретатор Python только пытается определить местонахождение недопустимого синтаксиса. Он указывает только на то, где впервые заметил проблему. Итак, когда вы получаете трассировку SyntaxError, это означает, что вы должны визуально проверить, указывает ли интерпретатор на правильную ошибку.
В приведенном выше примере интерпретатор обнаруживает недопустимый синтаксис внутри массива с именем age. Таким образом, это указывает на то, что внутри массива что-то не так.
Это синтаксическая ошибка.
В большинстве случаев разработчик Python пишет впечатляющий фрагмент кода, готовый к выполнению.Программа становится надежной моделью машинного обучения, но во время выполнения Python выдает неожиданную ошибку. К сожалению, это уже не типичная синтаксическая ошибка. Разработчики теперь имеют дело с логическими ошибками, также известными как исключения .
Давайте углубимся в исключения.
Исключения в Python
Исключения - это ошибки, возникающие во время выполнения. В основном эти ошибки логичны. Например, если вы попытаетесь разделить число на ноль, вы получите ошибку ZeroDivisionError.Когда вы открываете несуществующий файл (читаете), вы получаете FileNotFoundError. Далее, когда вы попытаетесь импортировать несуществующий модуль, вы получите ошибку ImportError.
Вот как Python обрабатывает вышеупомянутые ошибки:
ZeroDivisionError
>>> 2/0
Traceback (последний вызов последним):
Файл «
ZeroDivisionError: деление на ноль
FileNotFoundError
>>> open («stack.txt »)
Traceback (последний вызов последним):
Файл«
FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'stack.txt'
ImportError
>>> from collection import qwerty
Traceback (последний вызов последним):
Файл «
ImportError: невозможно импортировать имя «qwerty»
Всякий раз, когда возникает ошибка времени выполнения, Python создает объект исключения.Затем он создает и печатает трассировку этой ошибки с подробностями о том, почему произошла ошибка.
Вот общие исключения в Python:
- IndexError - Вы получите эту ошибку, если индекс не найден в последовательности. Например, доступ к 6-му индексу, когда длина списка всего пять (5).
- IndentationError - Возникает, когда отступ указан неправильно.
- ValueError - Возникает, когда встроенная функция для типа данных имеет допустимый тип аргументов, но аргументы имеют недопустимые значения.
- IOError - Разработчики часто сталкиваются с этой ошибкой при сбое операции ввода / вывода.
- Арифметическая ошибка - Возникает при сбое числовых вычислений.
- Ошибка с плавающей запятой - Возникает при сбое вычисления с плавающей запятой.
- Ошибка утверждения - Возникает при ошибке утверждения утверждения.
- Ошибка переполнения - Разработчики получают эту ошибку, если результат арифметической операции слишком велик и становится нечитаемым для машины.
- Ошибка типа - Возникает, когда к объекту применяется неправильный тип функции или операции.
Вы можете посетить официальный сайт документации Python, чтобы получить более подробные сведения о встроенных исключениях Python . Хотя сообщество Python предлагает отличную поддержку, обсуждения развертывания приложений Python можно улучшить. Application Performance Management (APM) как Retrace, - отличный инструмент для работы с исключениями Python.Это поможет вам найти все возникшие исключения и определить их основную причину. Вы можете попробовать это бесплатно уже сегодня!
Перехват исключений в PythonДля перехвата исключений в Python используется прямая логика. Когда возникает исключение, интерпретатор Python останавливает текущий процесс. Это обрабатывается путем прохождения через вызывающий процесс. В противном случае программа выйдет из строя.
Например, программа Python имеет функцию X, которая вызывает функцию Y, которая, в свою очередь, вызывает функцию Z.Если исключение существует в функции Z, но не обрабатывается в Z, исключение переходит к Y, а затем к X. Просто это будет иметь эффект домино.
Необработанное исключение отображает сообщение об ошибке, и программа внезапно завершает работу. Чтобы избежать такого сценария, есть два метода обработки исключений Python:
- Try - Этот метод перехватывает исключения, вызванные программой
- Raise - Запускает исключение вручную с использованием настраиваемых исключений
Начнем с оператор try для обработки исключений.Поместите критическую операцию, которая может вызвать исключение, в предложение try. С другой стороны, поместите код, обрабатывающий исключения, в предложение except.
Разработчики могут выбирать, какие операции выполнять после обнаружения этих исключений. Взгляните на пример кода ниже:
import sys
list = ['x', 1e-15, 5]
для результата в списке:
try:
print («Результат», результат )
y = 1 / int (результат)
break
за исключением:
print («Уф!», Sys.exc_info () [0], «произошло».)
print («Следующий ввод, пожалуйста.»)
print ()
print («Ответ», результат, «есть», y)
Программа имеет массив под названием list с тремя элементами. Затем строка, вызывающая исключение, помещается в блок try. Если нет исключений, блок except будет пропущен, и логический поток будет продолжаться до последнего элемента. Однако, если возникает исключение, блок except перехватит его.
Результат:
Результат x
Уф!
Следующий ввод, пожалуйста.
Результат: 1e-15
Уф!
Следующий ввод, пожалуйста.
Результат: 5
Ответ на 5: 0,2
Чтобы напечатать имя исключения, мы используем функцию exc_info () внутри модуля sys. Первые два элемента вызывают исключения, поскольку целое число нельзя разделить на строку и нулевое значение. Следовательно, возникли исключения ValueError и ZeroDivisionError .
Перехват определенных исключений в PythonЧто делать, если вы хотите иметь дело с конкретным исключением? В предыдущем примере не было упоминания о каком-либо конкретном исключении в блоке except. Это не очень хорошая практика программирования, потому что она перехватит все исключения.
Кроме того, он будет обрабатывать все исключения одинаковым образом, что является неправильным подходом. Поэтому максимально используйте блок except и укажите, какие исключения он должен перехватывать.
Чтобы реализовать эту концепцию, мы можем использовать кортеж значений, чтобы указать несколько исключений.Вот пример псевдокода:
try:
# do something
# your statement
pass
except Exception_1:
#handle Exception_1 и выполнить этот оператор блока
pass
except Exception_2:
обработать Exception_2 и выполнить этот оператор блокапередать
за исключением Exception_3:
# обработать исключение_3 и выполнить этот оператор блока
пройти
за исключением:
# обрабатывает все другие исключения
пройти
бесплатный профилировщик кода Try Stackify, Префикс, чтобы писать лучший код на вашей рабочей станции.Префикс работает с .NET, Java, PHP, Node.js, Ruby и Python.
Вызов исключений в PythonДругой способ перехватить все исключения Python, когда они возникают во время выполнения, - использовать ключевое слово raise. Это ручной процесс, в котором вы можете при желании передать значения исключению, чтобы прояснить причину его возникновения.
>>> поднять IndexError
Traceback (последний вызов последним):
Файл «
IndexError
>>> raise OverflowError («Арифметическая операция слишком велика. ”)
Traceback (последний вызов последним):
Файл«
OverflowError: арифметическая операция слишком велика
Приведем простой код, чтобы проиллюстрировать, как работает ключевое слово Raise :
try:
x = int (input («Введите положительное целое число:»))
if x <= 0:
поднять ValueError («Это не положительное число!»)
за исключением ValueError как val_e:
print (val_e)
Вывод:
Введите положительное целое число: -6
Это не положительное число!
Введите положительное целое число: 6
Python try с предложением elseПри работе с исключениями бывают случаи, когда определенный блок кода внутри try выполнялся без ошибок.Таким образом, используйте необязательное ключевое слово else с оператором try.
Вот пример кода:
try:
number = int (input («Введите число:»))
assert number% 2 == 0
за исключением:
print («Это нечетное число! »)
else:
print (« Это четное число! »)
rem = number% 2
print (« Остаток », rem)
Результат:
Введите число : 3
Это нечетное число!
Введите число: 2
Это четное число!
Остаток равен 0
Python tryОператор try в Python имеет необязательный блок finally.Это означает, что он непременно выполняет блок. В то же время он высвобождает внешние ресурсы.
Некоторые примеры включают соединение между мобильным приложением и удаленным центром обработки данных через распределенную сеть. Все ресурсы должны быть чистыми после остановки программы, независимо от того, успешно она работает или нет.
Это работа блока finally, чтобы гарантировать выполнение. К таким действиям относятся закрытие файла или графического интерфейса и отключение от сети.
Посмотрите на пример ниже, чтобы проиллюстрировать, как работает операция:
try:
file = open («myFile.txt ”, encoding = 'utf-8')
# это выполняет файловые операции
finally:
f.close ()
Функция f.close () гарантирует, что файл будет закрыт, даже если во время выполнение программы.
Преимущества обработки исключений и правильного использования APMОшибки и ошибки являются частью пути каждого разработчика. Как было сказано выше, ошибки и исключения бывают разные. Итак, почему разработчики Python должны знать , как перехватывать исключения Python и управлять обработкой исключений?
Ответы на этот вопрос не являются теоретическими.Вместо этого давайте рассмотрим пример использования.
Например, вы имеете дело с огромным объемом данных. Итак, вы создаете программу, которая читает тысячи файлов в нескольких каталогах. Нет никакого способа, чтобы вы не столкнулись с ошибкой здесь. Возможные ошибки могут включать неправильный или отсутствующий тип файла, недопустимый формат файла или работу с другими расширениями файлов.
В этом случае невозможно открыть все файлы и написать сценарий, который мог бы удовлетворить это соответствующим образом. С помощью обработки исключений разработчики могут определять несколько условий.Например, разрешите недопустимый формат, сначала установив правильный формат, а затем прочитав файл.
Другой вариант - продолжить чтение данных и пропустить файлы с недопустимым форматом. Затем создайте файл журнала, который можно будет обработать позже. Чтобы помочь вам с файлами журналов, APM, такие как Retrace, являются отличным инструментом для работы с журналами . В нем есть функции ведения журналов и полезные аналитические данные, которые помогут вам с вашими приложениями Python.