簡體   English   中英

Powershell非終止錯誤並嘗試catch塊

[英]Powershell non terminating error and try catch block

我正在使用 power shell 控制台運行以下 power shell 腳本:

$ob1 = "nonexistingclass"
$a = new-object $ob1 
Write-Output "Created new object"
Write-Output "End"

這會打印錯誤。 然后繼續打印“Created new object”和“End”。 所以我假設這是一個非終止錯誤。

但是,如果我將 try catch 塊放在新對象周圍,如下所示:

$ob1 = "nonexistingclass"
try
{
    $a = new-object $ob1 
    Write-Output "Created new object"
}
catch
{ 
    Write-Error "Exception Message: $($_.Exception.Message)"     
}
Write-Output "End"

在這種情況下,catch 塊被命中並寫入異常消息。

我的問題是:

  1. 這是一個非終止錯誤嗎? 它看起來像一個非終止錯誤,因為在錯誤之后繼續執行(當沒有 try catch 塊時)。
  2. 如果這是非終止錯誤,為什么在我添加 try catch 塊時會命中 catch 塊? 我的理解是僅在終止錯誤時才會執行 catch 塊。
  3. 即使我在第一個示例(沒有 try catch 塊)中使用 -ErrorAction Stop 調用 new-object ,它仍然繼續執行並打印最后 2 行。 當我使用 -ErrorAction stop 時,我期望它應該拋出一個終止異常並且腳本執行應該停止。 我的理解有誤嗎?

終止錯誤並不總是意味着腳本將停止執行,它通常只是意味着它們拋出PipelineStoppedException ,這意味着處理將在該管道上停止,但將繼續執行腳本的其余部分。 所以要回答你的問題,是的,這是一個終止錯誤,但它並沒有停止整個腳本的執行,這就是它命中 catch 塊的原因。

-ErrorAction 停止開關只是有效地使 cmdlet 拋出終止錯誤,以便您可以捕獲錯誤,它不會停止腳本(因此您的最后一行仍然被執行)。 如果您希望腳本停止,您可以將Exit命令放在 catch 塊中以在該點結束腳本。

看:

終止錯誤

非終止錯誤

根據文檔,有兩種類型的 PowerShell 錯誤,終止和非終止。

還有另一種模糊的第三類錯誤。 此類錯誤由trytrap ,即它們的行為類似於終止,但它們不會在沒有trytrap情況下停止執行,即它們的行為類似於非終止。

例如,如果命令名稱未被識別為 cmdlet、函數、腳本文件或可運行程序的名稱,則 PowerShell 會發出錯誤。 此錯誤是否終止? 這取決於。 令人驚訝的是,默認情況下並非如此。

看起來在腳本中不斷使用錯誤操作首選項Stoptrytrap塊是一個好主意。 否則半終止錯誤可能會導致問題,因為調用仍在繼續。 請注意,默認的錯誤操作首選項是Continue

半終止錯誤的例子:

  1. 未找到命令。
  2. 被零除。
  3. 使用錯誤的參數調用 .NET 方法。
  4. PowerShell 無法將數據轉換為某種類型。
  5. 未找到 .NET 類型。 注意你的情況
  6. 在嚴格模式下找不到屬性。
  7. 在嚴格模式下找不到變量。
  8. 未找到命令參數。
  9. 分配給不可寫的變量。
  10. 不支持的提供程序功能。
  11. .NET 異常。

名單可能會繼續……

假設

測試給出了任何運行時異常都是半終止錯誤的想法。

使用測試腳本查看完整案例 - PowerShellTraps/Errors-of-unusual-type


更新(如評論中所述):

關於此類錯誤詳細信息的官方文檔並不多。 但這里是 PowerShell 文檔庫中的全面討論:

https://github.com/MicrosoftDocs/PowerShell-Docs/issues/1583

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM