5

在我的機器上,下列代碼片段中的每一個會拋出異常,而不是打印到標準輸出「1」和「2」 爲什麼異常不被捕獲?PowerShell - 爲什麼「除以零例外」不被捕獲?

try { 
    [int]$a = 1/0 
} 
catch { 
    write 1 
} 
finally { 
    write 2 
} 

try { 
    [int]$a = 1/0 
} 
catch [System.Exception] { 
    write 1 
} 
finally { 
    write 2 
} 

回答

10

由於您正在使用常量,解釋程序會嘗試預計算結果,並失敗,除以零錯誤。你的代碼甚至沒有被執行,所以沒有什麼可以陷阱。

您可以通過將您的代碼更改爲使用變量,強制執行它來驗證這一點。

try { 
    $divisor = 0 
    [int]$a = 1/$divisor 
} 
catch { 
    write 1 
} 
finally { 
    write 2 
} 

的Windows PowerShell在行動(第257頁)

這裏的例子使用了1/$空。之所以做這個而不是 只是1/0,是因爲PowerShell解釋器做了一些叫做 的常量表達式摺疊。

它查看僅包含常量值的表達式。當 看到一個,它在編譯時評估該表達式,因此它不需要浪費時間在運行時重新執行一次。

這意味着不可能的表達式,例如被零除, 被捕獲並視爲解析錯誤。解析錯誤不能被捕獲 ,並且當它們以交互方式輸入時不會被記錄,因此它們不是 就是一個很好的例子。 (如果一個腳本調用另一個腳本和 腳本有這些錯誤之一,調用腳本可以趕上它,但 腳本可以被解析不行。)

1

你可以試着投用那種線的例外:trap { "Your Exception" } 1/0
這將「0分」拋出異常。雖然我不明白爲什麼你的代碼不會拋出異常。
PS:是不是應該是catch [System.SystemException]? :)

4

的RuntimeException在V2不開捕。它已在v3中修復。

劃分爲零屬於此類別。

+0

+1 - 你有參考嗎? –

+1

所以......我的不好。 :)它不是RuntimeException。我剛剛複製了FullyQualifiedErrorId,並且沒有包含該場景的重要細節。 關於v3:我找不到任何參考(尚未)。 Doug Finke在他即將出版的書「PowerShell for Developers」中提到了這一計算方法,因此我嘗試並意識到在v3中它實際上可以被捕獲。對不起,由於使用錯誤的術語造成的任何混淆... :) – BartekB

+0

Thx爲更新。如果你找到一個參考,我希望你仍然可以在這裏發佈。 –

相關問題