[英]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.