Другие ответы на все указывают на то, что вы не должны улавливать общие исключения, но никто, кажется, не хочет говорить вам, почему, что необходимо для понимания, когда вы можете нарушить «правило». Here - описание. В принципе, это так, что вы не скрывают:
Так до тех пор, как вы заботитесь к не делайте ничего такого, все в порядке, чтобы поймать общее исключение. Например, вы могли бы предоставить информацию об исключении пользователя еще один способ, как:
- Present исключений, как диалоги в GUI
- исключения Перенести из рабочего потока или процесса контрольного потока или процесс в многопоточное или многопроцессорное приложение
Итак, как поймать общее исключение? Есть несколько способов. Если вы просто хотите, объект исключения, сделать это следующим образом:
try:
someFunction()
except Exception as ex:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
message = template.format(type(ex).__name__, ex.args)
print message
Сделать уверенmessage
доставленных до сведения пользователя в труднодоступном промаха пути! Печатать его, как показано выше, может быть недостаточно, если сообщение захоронено множеством других сообщений. Неспособность привлечь внимание пользователей равносильна проглатыванию всех исключений, и, если есть какое-то впечатление, вы должны были уйти после прочтения ответов на этой странице, это то, что это не очень хорошая вещь. Завершение исключающего блока с помощью инструкции raise
устранит проблему путем прозрачного повторения исключения, которое было обнаружено.
Разница между выше и используя только except:
без каких-либо аргументов имеет два аспекта:
- Голые
except:
не дает вам объект исключения инспектировать
- Исключения
SystemExit
, KeyboardInterrupt
и GeneratorExit
Арен» t, пойманный вышеуказанным кодом, который, как правило, вы хотите. См. exception hierarchy.
Если вы хотите же StackTrace вы получите, если вы не поймать исключение, вы можете получить, что, как это (все еще внутри, кроме пункта):
import traceback
print traceback.format_exc()
Если вы используете logging
модуль вы можете распечатать исключение из журнала (вместе с сообщением), как это:
import logging
log = logging.getLogger()
log.exception("Message for you, sir!")
Если вы хотите копать глубже и изучить стек, посмотрите на переменные и т.д., используйте post_mortem
функцию pdb
модуль внутри, за исключением блока:
import pdb
pdb.post_mortem()
Я нашел этот последний метод, чтобы быть полезным при охоте на ошибки.
Никогда не используйте голые 'except:' (без голого 'рейза'), кроме * возможно * один раз для каждой программы, и предпочтительно не тогда. –
Если вы используете несколько опций 'except', вам не нужно проверять тип исключения, это обычно делается для того, чтобы действовать в соответствии с конкретным типом исключения. –
Если вы беспокоитесь о типе исключения, это связано с тем, что вы уже рассмотрели, какие типы исключений логически могут возникнуть. –