gpt4 book ai didi

python - Maya - 在未捕获的异常上自动运行函数

转载 作者:行者123 更新时间:2023-12-01 09:05:48 26 4
gpt4 key购买 nike

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

我在网上找到的一个解决方案是覆盖/包装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 作为交互式 shell 运行,粘贴代码并在其中运行
  • 将文本保存为文件并使用 mayapy 执行
  • mayapy 作为交互式 shell 运行,粘贴代码并在其中运行

并且不起作用:

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

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

最佳答案

在我看来,让交互式 shell 干扰 excepthook ,而不是将您的 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

关于python - Maya - 在未捕获的异常上自动运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com