Как обрабатывать все, кроме одного исключения?
try:
something
except NoChildException:
raise NoChildException
except:
pass
Как обрабатывать все, кроме одного исключения?
try:
something
except NoChildException:
raise NoChildException
except:
pass
Ответ заключается в том, чтобы просто сделать raise
:
try:
...
except SomeException:
raise
except:
...
raise
без какого-либо выражения после того, как оно просто поднимет последнее исключенное исключение (даже если оно будет обработано!). Это примерно эквивалентно:
except SomeException as e:
raise e
Если вы считаете, что в блоке catch может быть выбрано другое исключение (в данном случае это явно невозможно), вы должны использовать последний формат, чтобы обеспечить повторное повышение правильного исключения.
Однако, как отмечено в моем комментарии:
Простой ответ: Не надо. Это действительно плохая практика, чтобы поймать все исключений, так как вы будете склонны поймать тех, кого вы не хотели, затушевывающие ошибки. Существует лишь небольшое количество законных случаев для делая такую вещь.
Просто уловите ошибки, которые, по вашему мнению, может вызвать ваш код, и вы знаете, как обращаться, и оставляйте любые другие. Если что-то еще произойдет, ваша программа выйдет из системы - что вам нужно, так как вы можете понять, почему это произошло и правильно ее обрабатывать.
Я бы предложил это как улучшение принятого ответа.
try:
dosomestuff()
except MySpecialException:
ttype, value, traceback = sys.exc_info()
raise ttype, value, traceback
except Exception as e:
mse = convert_to_myspecialexception_with_local_context(e, context)
raise mse
Этот подход улучшает принятый ответ, сохраняя исходный стек, когда MySpecialException пойман, поэтому, когда ваш обработчик исключений верхнего уровня регистрирует исключение, вы получите трассировку, указывающую на то, где было отправлено исходное исключение.
Я нашел контекст, в котором ловить все ошибки, но одно не плохо, а именно модульное тестирование.
Если у меня есть метод:
def my_method():
try:
something()
except IOError, e:
handle_it()
Тогда он мог бы иметь unit test, который выглядит следующим образом:
def test_my_method():
try:
my_module.my_method()
except IOError, e:
print "shouldn't see this error message"
assert False
except Exception, e:
print "some other error message"
assert False
assert True
Потому что вы теперь обнаружили, что my_method просто вызвал неожиданное исключение.