8

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

我试过这个

toc 是模块名称

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

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

编辑:还有一个问题:

如果我有:

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

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

4

2 回答 2

5

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

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

  • 如果模块包含一些常见的异常类(比如它处理一些 API 并且所有 API 错误都继承自基模块类),则使用此类捕获每个错误,
  • 如果模块没有这样的基本错误类,但有自己的异常类,你可以全部捕获它们,
  • 如果您想捕获每个错误(甚至像KeyErroror ValueError),那么您可以尝试这样做:

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

    (最好是单个调用,而不是更可能包含模块错误的更大块)

但是您应该知道,如果出现错误,这不会为您提供足够的信息(例如,您将不得不猜测您尝试调用的函数在那里不存在)。

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

于 2013-01-08T01:18:47.523 回答
4

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

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
于 2015-01-25T19:51:52.440 回答