43

如何处理除一个异常之外的所有异常?

try:
    something
except <any Exception except for a NoChildException>:
    # handling

像这样的东西,除了不破坏原始回溯:

try:
    something
except NoChildException:
    raise NoChildException
except Exception:
    # handling
4

4 回答 4

72

答案是简单地做一个bare raise

try:
    ...
except NoChildException:
    # optionally, do some stuff here and then ...
    raise
except Exception:
    # handling

这将重新引发最后抛出的异常,原始堆栈跟踪完好无损(即使它已被处理!)。

于 2013-04-20T18:17:49.310 回答
1

我会将此作为对已接受答案的改进。

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 时维护原始堆栈跟踪来改进已接受的答案,因此当您的顶级异常处理程序记录异常时,您将获得指向原始异常抛出位置的回溯。

于 2015-03-05T15:28:33.000 回答
1

Python 新手……但这不是一个可行的答案吗?我使用它并且显然有效....并且是线性的。

try:
    something
except NoChildException:
    assert True
except Exception:
    # handling

例如,我使用它来摆脱(在某些情况下无用)从 os.mkdir 返回异常 FileExistsError。

那就是我的代码是:

try:
  os.mkdir(dbFileDir, mode=0o700)
except FileExistsError:
  assert True

我只是接受目录无法以某种方式访问​​的事实作为中止执行。

于 2020-11-23T16:02:05.687 回答
-1

我发现了一个上下文,其中捕获所有错误但有一个并不是一件坏事,即单元测试。

如果我有一个方法:

def my_method():
   try:
      something()
   except IOError, e:
      handle_it()

然后它可能有一个看起来像这样的单元测试:

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 刚刚抛出了一个意外的异常。

于 2016-06-06T20:58:10.487 回答