我有一个程序(一个带有kivy的gui),它导入一个非标准模块(由我的一个同事制作),它为特定问题引发异常(例外)。我希望从该特定模块中捕获所有引发的异常,以便我可以在程序中引发弹出窗口。那么从特定模块中捕获异常异常的最佳方法是什么?
我试过这个
toc是模块名称
import toc
...
...
try:
...
...
except toc.Exception:
...
但这似乎不起作用,它会产生一个AtrributeError,说该模块没有属性'Exception'。我做错了什么?
编辑:还有一个问题:
如果我有:
try:
...
try:
....
except:
some small block code
except:
some large block code
异常处理是否会在本地块内工作?我的意思是如果我在较小的块中收到错误,错误处理会继续进行'某些小块代码'还是会转到'某些大块代码'?
答案 0 :(得分:2)
您可以捕获特定类型的所有异常,但您需要提供正确的类型。您的toc.Exception
不是异常类。
通常,您有三种方法,主要取决于模块的设计:
如果您想捕获每个错误(即使是KeyError
或ValueError
),那么您可以尝试执行此操作:
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