处理除一个例外的所有例外

时间:2013-04-20 18:03:47

标签: python exception exception-handling error-handling

如何处理除一个例外以外的所有例外情况?

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

这样的事情,除非不破坏原始的追溯:

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

4 个答案:

答案 0 :(得分:39)

答案是简单地做一个raise

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

这将重新引发最后抛出的异常,原始堆栈跟踪保持不变(即使它已被处理!)。

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

答案 2 :(得分:1)

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

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

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

那是我的代码是

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

我只是接受执行dir,因为该dir无法通过某种方式访问​​。

答案 3 :(得分:-1)

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

如果我有方法:

pattern = "C:\Users\Name\Folder\july\mid_2014-07-2?-00.csv"
bad_files=[]
for filename in glob.iglob(patterm):
    num_lines = sum(1 for line in open(filename))
    if num_lines!=144:
        s = 144 - num_lines
        bad_files.append(filename)
print bad_files  

然后它可能会有一个单元测试,看起来像:

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

因为您现在已经检测到my_method只是引发了意外的异常。