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

Exception handling 捕获导入模块中的所有异常,exception-handling,Exception Handling,我有一个程序(一个带有kivy的gui),它导入一个非标准模块(由我的一个同事制作),该模块针对非常特殊的问题引发异常(Exception)。我希望捕获该特定模块中所有引发的异常,以便在程序中引发弹出窗口。那么,从特定模块捕获引发的异常的最佳方法是什么 我试过这个 toc是模块名 import toc ... ... try: ... ... except toc.Exception: ... 但这似乎不起作用,它会生成一个atributeerror,表示模块没有“Ex

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

我试过这个

toc是模块名

import toc
...
...
try:
    ...
    ...
except toc.Exception:
    ...
但这似乎不起作用,它会生成一个atributeerror,表示模块没有“Exception”属性。我做错了什么

编辑:还有一个问题:

如果我有:

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

异常处理会在本地块内工作吗?我的意思是,如果我在较小的块中得到错误,错误处理将继续到“一些小块代码”还是“一些大块代码”?

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

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

  • 如果模块包含一些常见的异常类(比如它处理一些API,所有API错误都继承自基本模块类),则使用该类捕获每个错误
  • 如果模块没有这样的基本错误类,但是有自己的异常类,那么您可以捕获所有异常类
  • 如果您想捕获每个错误(甚至像
    KeyError
    ValueError
    ),则可以尝试执行以下操作:

    试试看:
    # ... 一些外部模块调用。。。
    除:
    # ... 一些异常处理。。。
    
    (最好用于单个调用,而不是更可能包含模块错误的较大块)

但是您应该知道,如果出现错误,这将无法为您提供足够的信息(例如,您必须猜测您试图调用的函数不存在)


还要确保没有其他方法来解决你的问题。您已经接近实现的危险程度,应该通过为您想要捕获的异常提供显式类来避免这种情况。

不要在您不想感到尴尬的代码中这样做,但这是可行的:

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

谢谢,这很有效。我还有一个问题(参考原问题中的一个编辑)@Crust3:如果捕捉到某个异常,它将不会到达“外部捕捉”。但是,如果您将在“try”部分之外引发异常(例如,通过犯一些错误或显式引发,特别是通过重新引发捕获的异常),那么这种异常将不会被内部结构捕获,并且将被进一步引发,直到它到达外部异常子句。够清楚吗?独自回答这些问题的另一个好方法是尝试它们,比如使用Python的空闲工具。