繁体   English   中英

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

[英]Catch custom Exception that is raised by a function inside the try-block

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

现在我知道只有在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

这有什么解决方案吗?

提前致谢!

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

一旦用户按下某个键,可能会有一个等待处理键回调的线程(或多个线程)的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))

那是因为函数内部的异常不会在运行时引发。 事实是try-except表达式将在运行时捕获异常,例如:

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

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

Env.addHotkey(resetKey, 0, resetRun)

这意味着在编译时(使用该函数时)之后会出现异常,在这种情况下,当您按下按钮时。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM