捕获由try-block内的函数引发的自定义异常

时间:2016-07-17 08:13:48

标签: python

我一直在尝试捕获应该由单击热键引起的异常,不幸的是,添加热键需要添加一个在按下热键时应该调用的函数。

现在我知道只有在try-catch块内部引发异常时才会捕获异常,但这似乎不起作用。

class resetException(Exception): pass

try:
    def resetRun(event):
        raise resetException

    Env.addHotkey(resetKey, 0, resetRun)

    while True:
        [...]
except resetException:
    popup("reset")

引发了异常,但似乎它没有在try-block中引发?如果我只是在没有函数的情况下提升resetException,那么这非常合适。

Exception in thread "Thread-8" Traceback (most recent call last):
  File "Sikuli\sikulix.jar\Lib\sikuli\Env.py", line 13, in hotkeyPressed
  File "Sikuli\Test.sikuli\Test.py", line 339, in resetRun
    raise resetException
__main__.resetException

有没有解决方案?

提前致谢!

3 个答案:

答案 0 :(得分:1)

问题是你不在主线程的上下文中。这是一个多线程环境,通过将键绑定到回调来暗示。

一旦用户按下某个键,可能会有一个等待处理键回调的线程(或多个线程)的eventloop。

您需要做的是将try-catch放在resetRun中,以便实际执行代码的线程(调用您的回调)可以处理异常。

您可以创建一个这样的包装器:

def with_try_catch(f):
    def wrapped():
        try:
            f()
        catch YourException:
            # handle exception
    return wrapped

现在像这样绑定:

Env.addHotkey(resetKey, 0, with_try_catch(resetRun))

答案 1 :(得分:0)

这是因为您的功能中的异常并未在运行时处引发。事实是try-except expression将在运行时捕获异常,例如:

>>> try:
...     def a():
...        raise ValueError
...     a()
... except ValueError:
...     print('The exception is caught')
... 
The exception caught

在这种情况下,您似乎只是实例化一个对象或smth。 (您的功能不在运行时执行)

Env.addHotkey(resetKey, 0, resetRun)

这意味着在编译时(使用该功能)后异常会增加,在这种情况下,当你按下按钮时。

因此,如果你想在函数内部处理异常,你需要在函数内部捕获它们。

答案 2 :(得分:-1)

我不是专家,但在我看来问题是你的def resetRun(event)位。 try...except指令集无法深入到函数定义中。如果您在try...except之外创建resetRun(事件),会发生什么?那会有用吗?