Мне нужно остановить мою программу, когда в Python возникает исключение. Как мне это реализовать?
@Gortok: Спасибо за добавление тега [plzsendthecodez]. Это сделало мой день!
Если бы мы были в стране C++, я бы подумал, что вы ищете эквивалент «catch throw» в GDB. Однако в Python исключение несет в себе обратную трассировку, сообщающую вам, откуда оно было выбрано. Этого мало?






Насколько мне известно, если ваш скрипт не обнаружит исключение, оно будет прервано.
import sys
try:
print("stuff")
except:
sys.exit(1) # exiing with a non zero value is better for returning from an error
sys.exit (1) будет более подходящим.
@bruno desthuilliers Что ж, это довольно очевидно. Все, что он спрашивает, - это завершение сценария при возникновении исключения.
@Deestan - Почему sys.exit(1) более подходит ..?
@ kramer65: Код выхода программы 0 означает «завершено без ошибок». Поскольку вызов sys.exit вызван ошибкой, он должен выдавать код выхода программы, отличный от 0. 1 - это всего лишь предложение.
@ LoïcWolff: При возникновении необработанного исключения сценарию нечего делать. Это просто поведение по умолчанию - и, по крайней мере, это гораздо более разумное поведение, поскольку 1 / выводит полезное сообщение об ошибке, включая полную трассировку, а 2 / возвращает соответствующий (ненулевой) код выхода.
Вы можете перестать ловить исключение или - если вам нужно его поймать (чтобы выполнить некоторую индивидуальную обработку), вы можете повторно поднять:
try:
doSomeEvilThing()
except Exception, e:
handleException(e)
raise
Обратите внимание, что ввод raise без передачи объекта исключения приводит к сохранению исходной трассировки. Обычно он намного лучше, чем raise e.
Конечно, вы также можете явно вызвать
import sys
sys.exit(exitCodeYouFindAppropriate)
Это вызывает исключение SystemExit и (если вы его где-то не поймаете) завершает работу вашего приложения с указанным кодом выхода.
Как упоминалось в этот ответ, вы можете использовать sys.exc_info(), чтобы получить достаточно информации для сохраненного повторного raise, если требуется некоторая обработка.
Если вы не обрабатываете исключение, оно будет распространяться вверх по стеку вызовов до интерпретатора, который затем отобразит обратную трассировку и завершится. IOW: вам не нужно выполнять что-нибудь, чтобы ваш скрипт завершил работу при возникновении исключения.
Это единственный реальный ответ на неспецифический вопрос. Все остальные ответы, похоже, делают некоторые неявные предположения о том, что имел в виду автор. Поскольку мы говорим о Python, мы должны сохранять его как можно более явным ??
import sys
try:
import feedparser
except:
print "Error: Cannot import feedparser.\n"
sys.exit(1)
Здесь мы выходим с кодом состояния 1. Обычно также полезно вывести сообщение об ошибке, записать в журнал и очистить.
необработанное исключение БУДЕТ выводиться с (гораздо более полезным) сообщением об ошибке (а также с полной трассировкой) И завершается с ненулевым статусом. Приведенный выше фрагмент кода является анти-шаблоном.
Это действительно зависит от того, для чего создается исключение. Помните, что паттерн более высокого уровня - EAFP. Таким образом, вполне возможно, что обработка исключений используется для создания обратной связи с пользователем, и этот пользователь может заботиться только о нормальном сообщении об ошибке и может действовать лучше без следа. Вы можете использовать logging.exception, чтобы записать трассировку в журнал, предоставить пользователю содержательную обратную связь, а затем внести залог без повторной генерации исключения.
import sys
try:
# your code here
except Exception as err:
print("Error: " + str(err))
sys.exit(50) # whatever non zero exit code
Добро пожаловать в SO! Пожалуйста, предоставьте объяснение вместе с вашим кодом. Ваш код также выйдет, даже если не было сделано исключения
Это не дает ответа на вопрос. Как только у вас будет достаточно репутация, вы сможете комментировать любой пост; вместо этого дать ответы, не требующие пояснений от спрашивающего. - Из обзора
Как вы хотите, чтобы ваша программа остановилась?