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 内部)。
总结一下 - 上述方法的工作原理是:
- 将文本保存为文件并使用
python
执行
- 运行
python
作为交互式 shell,粘贴代码并 运行 将其放入其中
- 将文本保存为文件并使用
mayapy
执行
- 运行
mayapy
作为交互式 shell,粘贴代码并 运行 将其放入其中
并且不适用于:
- 运行 Maya 脚本编辑器中的代码或作为搁架按钮或菜单项的代码。
如果有另一种更好的方法来实现我想要的,请告诉我。否则,是否有此技术不起作用的原因?任何帮助将不胜感激。
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
我正在尝试构建一个 运行 仅在引发未捕获的异常时才会出现的函数。
我在网上找到的一个解决方案是重写/包装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 内部)。
总结一下 - 上述方法的工作原理是:
- 将文本保存为文件并使用
python
执行
- 运行
python
作为交互式 shell,粘贴代码并 运行 将其放入其中 - 将文本保存为文件并使用
mayapy
执行
- 运行
mayapy
作为交互式 shell,粘贴代码并 运行 将其放入其中
并且不适用于:
- 运行 Maya 脚本编辑器中的代码或作为搁架按钮或菜单项的代码。
如果有另一种更好的方法来实现我想要的,请告诉我。否则,是否有此技术不起作用的原因?任何帮助将不胜感激。
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