Maya - 自动 运行 处理未捕获的异常

Maya - Automatically run function on an uncaught exception

我正在尝试构建一个 运行 仅在引发未捕获的异常时才会出现的函数。

我在网上找到的一个解决方案是重写/包装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 运行,它将打印 "Uncaught exception was found"。如果你在 bar() 周围添加 try/except,它不会 运行。这正是我想要的功能。

这甚至适用于交互式 Python shell 并使用 mayapy。我发现它唯一不起作用的情况是在 Autodesk Maya 本身中。您可以 运行 脚本编辑器中的上述代码作为菜单项或搁架按钮,它不会 运行 exception 函数的内容。奇怪的是,它在 Nuke 中确实有效(既使用其 python 解释器,也来自 Nuke 内部)。

总结一下 - 上述方法的工作原理是:

并且不适用于:

如果有另一种更好的方法来实现我想要的,请告诉我。否则,是否有此技术不起作用的原因?任何帮助将不胜感激。

IMO 让 excepthook 干预交互式 shell 而不是将你的 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