2015-04-21 58 views
2

因此,我一直在使用Powershell進行錯誤處理,並且目前爲止使用Try/Catch,並且每當發生錯誤時,它都會寫入日誌文件。在PowerShell中捕獲意外錯誤

現在我該如何處理意外錯誤?我應該只將整個腳本代碼放在Try/Catch區塊中,還是有更好的方法來做到這一點?

感謝您的任何幫助。

+0

我想'再/ Catch'是在PowerShell中處理錯誤的最好方法。處理任何其他「未發生」錯誤的目的是什麼?是否更好地處理實際上可能產生錯誤的代碼的任何部分? – Naigel

+0

是的,當然,我會用我製作的任何腳本的主要部分來做到這一點。但是,將每個'Get-Date'或'Set-Variable'放在'Try/Catch'塊中會使腳本不必要很長時間。另外,這些命令是我從來沒有見過的執行失敗的,所以我專注於腳本中不穩定的部分,並在那裏使用'Try/Catch'。每一個其他的錯誤都可能是一個意想不到的錯誤,因爲我從字面上不會指望我的腳本崩潰。 – mariu5

+0

我同意你的意見,那將是不必要的。那麼爲什麼在Get-Date或Set-Variable上捕獲不可能的錯誤呢?你如何有效地處理它們? – Naigel

回答

2

是的,有。您可以定義一個Trap在腳本的頂部和日誌的最後一個錯誤:

trap 
{ 
    Write-host $Error[0] 
} 
+0

這是一個很好的提示,但是當我使用陷阱時,PowerShell在控制檯中顯示錯誤,我不希望這樣。我無法將'$ ErrorActionPreference'設置爲'SilentlyContinue',因爲那樣我的Try/Catch就無法工作。有沒有辦法使用'陷阱'沒有輸出? – mariu5

0

你是對的。當你使用默認的try/catch(/ finally)語句時,所有的異常都會被捕獲到catch塊中。

try { 

    Do-Someting 

} catch { 

    Write-Host "Caught the following error: $($_.Exception.Message)" 

} finally { 

    Write-Host "Finally, we made it!" 

} 

當你特別添加例外趕上,你可以爲異常創建具體行動:

try{ 

    Do-Something 

} catch [System.Management.Automation.ItemNotFoundException]{ 

    # catching specific exceptions allows you to have 
    # custom actions for different types of errors 
    Write-Host "Caught an ItemNotFoundException: $($_.Exception.Message)" -ForegroundColor Red 

} catch { 

    Write-Host "General exception: $($_.Exception.Message)" 

} 
相關問題