簡體   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