Проблема:Изящно ручки подавленные (необработанные) исключения в PyQt4
Я пытаюсь выяснить, лучший метод для обработки необработанного исключения, которые обычно получают подавленные PyQt.
Моего решения прямо сейчас, чтобы украсить соответствующие методы со следующим декоратором
def handleExceptions(func):
"""
Decorator: create and show message box for every unhandled exception that
reaches the decorator
"""
@functools.wraps(func)
def decorator(self):
try:
func(self)
except Exception as error:
# ...
if errBox.exec_() == QMessageBox.Ok:
try:
self.closeApp()
except AttributeError:
exit()
return decorator
Однако это решение работает только тогда, когда ни один из украшенных методов не требуется больше параметров, чем self
. Я пытался расширить декоратора, как этот
...
def decorator(self, *args)
try:
func(self, *args)
...
Это позволяет вызывать функции с одним или несколькими параметрами (в том числе self
). К сожалению, этот код нарушает доступ к методам, для которых нет параметров, кроме self
, которые выходят из строя с сообщением TypeError: method() takes 1 positional argument but 2 were given
.
После использования отладчика я выяснил, что второй параметр в *args
выглядит как bool (False
).
Вопросы:
- Почему этот дополнительный параметр получить прошло?
- Каким образом декоратор может быть изменен для использования с функциями переменной длины параметров?
- Это даже хороший способ справиться с исключениями? Я был бы признателен, если бы кто-нибудь мог сказать мне обычный метод обработки необработанных исключений в PyQt.
Я посмотрел другие решения, как this one (который я не полностью understant) и пытался реализовать их без успеха (он либо выбрасывает исключения, как мой один или полностью ломает декорированные методы).
Заранее благодарен!
Декоратор кажется ужасно сложным и сложным в обслуживании. [Другой ответ] (http://www.riverbankcomputing.com/news) в вопросе, который вы связали, предлагает использовать [excepthook] (http://docs.python.org/3/library/sys.html#sys .excepthook). Я не знаю, почему кто-то мог бы использовать что-либо еще, учитывая, насколько просто реализовать. – ekhumoro