Cru*_*st3 8 exception-handling
我有一个程序(带有 kivy 的 gui),它导入一个非标准模块(由我的一位同事制作),该模块针对非常特殊的问题引发异常(Exception)。我希望从该特定模块中捕获所有引发的异常,以便我可以在我的程序中引发一个弹出窗口。那么从特定模块捕获引发异常的最佳方法是什么?
我试过这个
toc 是模块名称
import toc
...
...
try:
...
...
except toc.Exception:
...
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用,它产生一个 AtrributeError 说该模块没有属性“异常”。我究竟做错了什么?
编辑:还有一个问题:
如果我有:
try:
...
try:
....
except:
some small block code
except:
some large block code
Run Code Online (Sandbox Code Playgroud)
异常处理会在本地块内工作吗?我的意思是,如果我在较小的块中遇到错误,错误处理会转到“一些小块代码”还是会转到“一些大块代码”?
不要在您不想感到尴尬的代码中执行此操作,但这是有效的:
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
Run Code Online (Sandbox Code Playgroud)
您可以捕获特定类型的所有异常,但您需要提供正确的类型。你toc.Exception不是一个例外类。
通常,您有三种方法,主要取决于模块的设计:
如果您想捕获每个错误(甚至像KeyError或ValueError),那么您可以尝试这样做:
try:
# ... some external module call ...
except:
# ... some exception handling ...
Run Code Online (Sandbox Code Playgroud)
(最好是单一的呼叫,而不是更大的块更有可能包含你的模块错误)
但是您应该知道,如果出现错误,这不会为您提供足够的信息(例如,您将不得不猜测您尝试调用的函数在那里不存在)。
还要确保没有其他方法可以解决您的问题。您非常接近实施尿布模式,并且应该通过为要捕获的异常提供显式类来避免这种情况。