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