我有一個很大的專案,里面有很多功能。只有2個問題:
- 這里關于錯誤處理的“最佳實踐”是什么?要對每個函式使用本地處理,還是在 Main-Section 中僅使用一個錯誤記錄?
- 棘手的部分(!),讓我們看看函式 F_XXX 中奇怪的錯誤行為:只有 $_ 傳遞錯誤訊息,$Error[0] 在這里是空的!奇怪的是,當我單獨啟動函式 F_XXX(從模塊中洗掉)時,它的行為符合預期,這意味著:$Error[0] 回傳錯誤。編碼:
塊參考
$ErrorActionPreference = "Stop"
Function F1
{
try
{
# do something
}
catch
{
# 1. cascade Error to Main?
# throw $Error[0].InnerException
# or
# local Error-Logging?
write-MyErrorLogging -message $Error[0].InnerException
}
}
Function F2
{
try
{
# do something
}
catch
{
# 1. cascade Error to Main?
# throw $Error[0].InnerException
# or
# local Error-Logging?
write-MyErrorLogging -message $Error[0].InnerException
}
}
Function F_XXXXXX
{
try
{
cls
write-host "The install data is copied.."
$share = "\\my_wrong_path\sql_sources\"
Copy-Item $share -Destination $installDrive -Force -Recurse
}
catch
{
$Error[0] #here is nothing!
$null -eq $Error[0] # here true
$_.Exception # only here the error-message: wrong path!
}
}
塊參考
# here Main
try
{
F1
F2
F_XXXXXX
}
catch
{
write-MyErrorLogging -message $Error[0].InnerException
}
塊參考
uj5u.com熱心網友回復:
在
catch塊內,最好避免$Error[0],因為手頭的錯誤可靠地反映在自動$_變數中。- 如果您確實需要通過自動變數訪問以前的錯誤,請使用內部模塊- 有關詳細資訊,請參閱底部部分。
$Error$global:Error
- 如果您確實需要通過自動變數訪問以前的錯誤,請使用內部模塊- 有關詳細資訊,請參閱底部部分。
除非您需要在發生錯誤時執行其他
$ErrorActionPreference = "Stop"操作,否則您可以讓腳本終止(致命)錯誤(您的陳述句將代碼中的所有錯誤轉化為該錯誤)在呼叫堆疊中冒泡,直到它被try/catch陳述句捕獲或,如果沒有,則終止整個呼叫堆疊(即腳本及其呼叫者)。- 如果您確實需要執行其他操作,請使用
try/catch并將這些操作放在catch塊內(以及塊中的潛在清理操作finally),然后只需通過不帶引數的呼叫來重新引發錯誤。throw
- 如果您確實需要執行其他操作,請使用
因此,您可以在腳本的頂級范圍內使用單個 try/陳述句:catch
# Turn all errors in this and descendant scopes into
# script-terminating (fatal) ones.
$ErrorActionPreference = 'Stop'
# ... other function definitions, without try / catch
# Top-level code that calls the other functions and catches
# any errors.
try
{
F1
F2
F_XXXXXX
}
catch
{
write-MyErrorLogging -message $_.InnerException
}
模塊中的自動$Error變數:
奇怪的是,至少 PowerShell 7.2.3(在撰寫本文時為當前版本):
發生在模塊中的錯誤——就像發生在模塊外的錯誤一樣——被記錄在全域范圍內的
$Error變數中。但是,存在一個看似未使用的模塊本地副本,
$Error它隱藏了全域變數。
解決方法是使用內部$global:Error模塊使用。
該行為暗示了一個錯誤,因為模塊本地副本似乎從未被觸及并且沒有明顯的用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471037.html
