【发布时间】:2017-03-04 06:48:26
【问题描述】:
问题:
我正在尝试找出处理通常被 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 中的第二个参数似乎是一个布尔值 (False)。
问题:
- 为什么要传递这个附加参数?
- 如何修改装饰器以允许使用不同参数长度的函数?
- 这甚至是处理异常的好方法吗?如果有人能告诉我在 PyQt 中处理未处理异常的常用方法,我将不胜感激。
我查找了其他解决方案,如 this one(我不完全理解)并尝试实施它们但没有成功(它要么抛出像我这样的异常,要么完全破坏修饰的方法)。
提前致谢!
【问题讨论】:
-
装饰器看起来过于复杂且难以维护。您链接到的问题中的other answer 建议使用excepthook。我不知道为什么有人会考虑使用其他任何东西,因为它实现起来非常简单。
标签: python-3.x exception-handling pyqt4 decorator