Maya - Автоматически запускать функцию для необработанного исключения - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать функцию, которая запускается только при возникновении необработанных исключений.

Решение, которое я нашел в Интернете, заключается в переопределении / переносе 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(), она не запустится. Это именно та функциональность, которую я хочу.

Это работает даже в интерактивной оболочке Python и использует mayapy. Единственная ситуация, в которой я обнаружил, что она не работает - это сама Autodesk Maya. Вы можете запустить приведенный выше код в редакторе сценариев, как элемент меню или кнопку полки, и он не запускает содержимое функции exception. Однако, как ни странно, он работает в Nuke (как с использованием его интерпретатора Python, так и изнутри Nuke).

Итак, подведем итог - вышеупомянутый метод работает по:

  • Сохранение текста в виде файла и выполнение его с помощью python
  • Запуск python в качестве интерактивной оболочки, вставка кода и запуск его там
  • Сохранение текста в виде файла и выполнение его с помощью mayapy
  • Запуск mayapy в качестве интерактивной оболочки, вставка кода и запуск его там

И не работает:

  • Запуск кода в редакторе сценариев Maya или в виде кнопки полки или пункта меню.

Если есть другой, лучший способ добиться того, чего я хочу, пожалуйста, дайте мне знать. Иначе, есть ли причина, почему этот метод не работает? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 августа 2018

IMO, было бы чётче позволить вмешиваться с exchook в интерактивные оболочки и вместо этого обернуть main в try/except, а затем просто повторно вызвать исключение после вашей специальной обработки, например:

def main():
    foo()

try:
    main()
except Exception as e:
    print(f'Uncaught exception was found:   {type(e).__name__}: {e}')
    raise

Но если вам нравится использовать кромеhohook, этот блог описывает решение для 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
...