Как остановить программу, когда в Python возникает исключение?

Мне нужно остановить мою программу, когда в Python возникает исключение. Как мне это реализовать?


person user46646    schedule 13.01.2009    source источник
comment
Как вы хотите, чтобы ваша программа остановилась?   -  person PEZ    schedule 13.01.2009
comment
@Gortok: Спасибо за добавление тега [plzsendthecodez]. Это сделало мой день!   -  person S.Lott    schedule 13.01.2009
comment
Если бы мы были в стране C++, я бы подумал, что вы ищете эквивалент catch throw в GDB. Однако в Python исключение содержит обратную трассировку, указывающую, откуда именно оно было выброшено. Разве этого недостаточно?   -  person    schedule 13.01.2009


Ответы (6)


Вы можете перестать перехватывать исключение или, если вам нужно его перехватить (чтобы выполнить какую-то пользовательскую обработку), вы можете повторно вызвать:

try:
  doSomeEvilThing()
except Exception, e:
  handleException(e)
  raise

Обратите внимание, что ввод raise без передачи объекта исключения приводит к сохранению исходной трассировки. Обычно это намного лучше, чем raise e.

Конечно, вы также можете явно вызвать

import sys 
sys.exit(exitCodeYouFindAppropriate)

Это вызывает исключение SystemExit и (если вы его где-то не поймаете) завершает ваше приложение с указанным кодом выхода.

person Abgan    schedule 13.01.2009
comment
Как упоминалось в этом ответе, однако вы можете использовать sys.exc_info() для получения достаточной информации для сохраненного re-raise, если требуется некоторая обработка - person Tobias Kienzler; 12.11.2014

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

person bruno desthuilliers    schedule 13.01.2009
comment
Это единственный реальный ответ на неконкретный вопрос. Все остальные ответы, кажется, делают некоторые неявные предположения о том, что имел в виду автор. Поскольку мы говорим о Python, мы должны сделать это как можно более явным ???????? - person tbrlpld; 27.04.2020

import sys

try:
    import feedparser
except:
    print "Error: Cannot import feedparser.\n" 
    sys.exit(1)

Здесь мы выходим с кодом состояния 1. Обычно также полезно вывести сообщение об ошибке, записать в журнал и очистить.

person Pranab    schedule 18.11.2009
comment
необработанное исключение БУДЕТ выводиться с (гораздо более полезным) сообщением об ошибке (и полной трассировкой тоже) И выходить с ненулевым статусом. Ваш приведенный выше фрагмент кода является анти-шаблоном. - person bruno desthuilliers; 08.10.2014
comment
Это действительно зависит от того, для чего создается исключение. Помните, что шаблон более высокого уровня — это EAFP. Таким образом, вполне возможно, что обработка исключений используется для создания обратной связи с пользователем, и этот пользователь может заботиться только о разумном сообщении об ошибке и мог бы добиться большего успеха без трассировки. Вы можете использовать logging.exception, чтобы записать трассировку в журнал, представить пользователю значимую обратную связь, а затем выйти из игры без повторного возбуждения исключения. - person cowbert; 29.06.2019

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

person Keltia    schedule 13.01.2009

person    schedule
comment
sys.exit(1) будет более подходящим. - person Deestan; 13.01.2009
comment
@bruno desthuilliers Ну, это довольно очевидно. Все, что он спрашивает, это выход сценария при возникновении исключения. - person Loïc Wolff; 14.01.2009
comment
@Deestan - Почему sys.exit(1) больше подходит ..? - person kramer65; 11.07.2014
comment
@ kramer65: Код выхода программы 0 означает завершение без ошибок. Поскольку вызов sys.exit, по-видимому, вызван ошибкой, он должен дать код выхода программы, отличный от 0. 1 это просто предложение. - person Deestan; 11.08.2014
comment
@LoïcWolff: скрипту нечего делать, чтобы завершить работу при возникновении необработанного исключения. Это просто поведение по умолчанию - и, по крайней мере, это гораздо более разумное поведение, поскольку 1/ оно печатает полезное сообщение об ошибке, включая полную трассировку, и 2/ возвращает соответствующий (не нулевой) код выхода. - person bruno desthuilliers; 08.10.2014

person    schedule
comment
Добро пожаловать в СО! Пожалуйста, предоставьте некоторые пояснения вместе с вашим кодом. Ваш код также завершится, даже если не будет сделано исключение - person M Z; 10.08.2020
comment
Это не дает ответа на вопрос. Получив достаточную репутацию, вы сможете /comment">прокомментировать любой пост; вместо этого дайте ответы которые не требуют разъяснений от спрашивающего. – Из обзора - person wscourge; 11.08.2020