我正在尝试构建仅在引发未捕获的异常时才运行的功能。
我在网上找到的解决方案是覆盖/包装sys.excepthook
,如下所示:
import sys
def exception(*args, **kwargs):
print('Uncaught exception was found', args, kwargs)
sys.excepthook = exception
def foo():
bar()
def bar():
raise ValueError('I am an exception. Catch me if you can!')
foo()
如果将以上代码保存到文件中并使用python
运行,它将显示“找到了未捕获的异常”。并且,如果您在bar()
周围添加了try / except,它将无法运行。这正是我想要的功能。
这甚至可以在交互式Python shell中并使用mayapy
来工作。我发现它不起作用的唯一情况是在Autodesk Maya本身内部。您可以在脚本编辑器中,作为菜单项或作为架子按钮来运行以上代码,它不会运行exception
函数的内容。奇怪的是,它确实可以在Nuke中运行(都使用它的python解释器,并且可以从Nuke内部使用)。
总结一下,以上方法的工作原理是:
python
python
作为交互式外壳运行,粘贴代码并在其中运行mayapy
mayapy
作为交互式外壳运行,粘贴代码并在其中运行不适用于:
如果还有另一种更好的方法来实现我想要的功能,请告诉我。否则,是否有这种技术无效的原因?任何帮助将不胜感激。
答案 0 :(得分:1)
IMO,最好让它与除钩挂钩交互,然后将main
包裹在try/except
中,然后在进行特殊处理后再引发异常,这样比较干净:
def main():
foo()
try:
main()
except Exception as e:
print(f'Uncaught exception was found: {type(e).__name__}: {e}')
raise
但是,如果您想使用excepthook,this blog将介绍Maya的解决方案:
import maya.utils
def myExceptCB(etype, value, tb, detail=2):
# do something here...
print "do something here..."
return maya.utils._formatGuiException(etype, value, tb, detail)
maya.utils.formatGuiException = myExceptCB