Maya-在未捕获的异常上自动运行功能

时间:2018-08-28 13:19:06

标签: python exception maya

我正在尝试构建仅在引发未捕获的异常时才运行的功能。

我在网上找到的解决方案是覆盖/包装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作为交互式外壳运行,粘贴代码并在其中运行

不适用于:

  • 在Maya脚本编辑器中或作为架子按钮或菜单项运行代码。

如果还有另一种更好的方法来实现我想要的功能,请告诉我。否则,是否有这种技术无效的原因?任何帮助将不胜感激。

1 个答案:

答案 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