从导入的模块中捕获所有异常

时间:2013-01-08 01:10:48

标签: exception-handling

我有一个程序(一个带有kivy的gui),它导入一个非标准模块(由我的一个同事制作),它为特定问题引发异常(例外)。我希望从该特定模块中捕获所有引发的异常,以便我可以在程序中引发弹出窗口。那么从特定模块中捕获异常异常的最佳方法是什么?

我试过这个

toc是模块名称

import toc
...
...
try:
    ...
    ...
except toc.Exception:
    ...

但这似乎不起作用,它会产生一个AtrributeError,说该模块没有属性'Exception'。我做错了什么?

编辑:还有一个问题:

如果我有:

try:
    ...
    try:
        ....
    except:
        some small block code
except:
    some large block code

异常处理是否会在本地块内工作?我的意思是如果我在较小的块中收到错误,错误处理会继续进行'某些小块代码'还是会转到'某些大块代码'?

2 个答案:

答案 0 :(得分:2)

您可以捕获特定类型的所有异常,但您需要提供正确的类型。您的toc.Exception不是异常类。

通常,您有三种方法,主要取决于模块的设计:

  • 如果模块包含一些常见的异常类(比如它处理某些API并且所有API错误都从基本模块类继承),请使用此类捕获每个错误,
  • 如果模块没有这样的基本错误类,但是有自己的异常类,你可以全部捕获它们,
  • 如果您想捕获每个错误(即使是KeyErrorValueError),那么您可以尝试执行此操作:

    try:
        # ... some external module call ...
    except:
        # ... some exception handling ...
    

    (最好是单次调用,不适用于更有可能包含 模块错误的更大块)

但是你应该知道,如果出现错误,这将不会给你足够的信息(例如,你必须猜测你试图调用的函数不存在)。

还要确保没有其他方法可以解决您的问题。您非常接近于实现Diaper Pattern,并且应该通过为要捕获的异常提供显式类来避免这种情况。

答案 1 :(得分:2)

请勿在您不想尴尬的代码中执行此操作,但这样做有效:

import requests, inspect

exception_types = [obj for name, obj in inspect.getmembers(requests.exceptions) if inspect.isclass(obj) and issubclass(obj, Exception)]

try:
    raise requests.exceptions.HTTPError()
except Exception as e:
    if any(issubclass(e.__class__, lv) for lv in exception_types):
        print "This exception came from requests.exceptions"
    else:
        print "This exception came from somewhere else"
        raise