我一直在尝试捕获应该由单击热键引起的异常,不幸的是,添加热键需要添加一个在按下热键时应该调用的函数。
现在我知道只有在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
有没有解决方案?
提前致谢!
答案 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(事件),会发生什么?那会有用吗?