以下代码尝试使用两种具有不同错误管理技术的函数以三种不同的方式复制文件test
:
这两个函数中的一个使用try/catch
来管理错误,并且能够检测前两个错误,另一个使用-ErrorAction
并且能够检测到第三个错误。
是否有一种技术来捕获所有错误?
或者我是否总是需要使用这两种技术?
function TestTryCatch($N, $Source, $Dest) {
Write-Output "$N TestTryCatch $Source $Dest"
try {Copy-Item $Source $Dest}
catch {Write-Output "Error: $($error[0].exception.message)"}
}
function TestErrorAction($N, $Source, $Dest) {
Write-Output "$N TestErrorAction $Source $Dest"
Copy-Item $Source $Dest -ErrorAction SilentlyContinue
if(!$?) {Write-Output "Error: $($error[0].exception.message)"}
}
New-Item 'test' -ItemType File | Out-Null
(New-Item 'hidden' -ItemType File).Attributes = 'Hidden'
TestTryCatch 1 'test' 'test'
TestTryCatch 2 'test' 'hidden'
TestTryCatch 3 'test' 'nonexistingfolder\test'
TestErrorAction 1 'test' 'test'
TestErrorAction 2 'test' 'hidden'
TestErrorAction 3 'test' 'nonexistingfolder\test'
Remove-Item 'test'
Remove-Item 'hidden' -Force
答案 0 :(得分:2)
如果您使用-ErrorAction Stop
,那么您的第一个版本应该可以捕获所有错误:
function TestTryCatch($N, $Source, $Dest) {
Write-Output "$N TestTryCatch $Source $Dest"
try {Copy-Item $Source $Dest -ErrorAction Stop}
catch {Write-Output "Error: $($error[0].exception.message)"}
}
这里的关键是Powershell区分终止和非终止错误,并且try {}
不会捕获非终止错误。使用-ErrorAction Stop
强制非终止错误来停止执行,从而导致它们被捕获。