PowerShell异常处理
在本文中,我们将学习以下几点。
什么是PowerShell中的异常?
终止错误和非终止错误。
使用Try/Catch块。
将非终止错误转换为终止错误。
处理实际的异常消息。
什么是PowerShell中的异常?
PowerShell或其他编程语言中的异常是可以处理的错误或意外结果。例如,执行过程中找不到文件,或将数字除以零。
如果未正确处理异常,则可能会停止脚本执行。
终止错误和非终止错误
非终止错误不会中断脚本执行,即使在脚本中检测到错误,脚本也会继续运行。以下是非终止错误的示例。
示例1
if(Get-Service -Name DoesntExist) { Write-Output "Service Found" }else { Write-Output "Service not found" } Write-Output "This Line will be printed"
输出
正如您所看到的,即使找不到服务名称,Write-Output 也会被打印。因此,脚本执行继续。
终止错误会在发现错误时停止脚本执行,如果您的程序没有设计成处理此类错误,则会被认为是一个严重的问题;有时,当我们需要在出现问题时终止脚本时,它们会很有用。
“Throw”命令会终止脚本。
示例2
if(Get-Service -Name DoesntExist) { Write-Output "Service Found" }else { throw "Service not found" } Write-Output "This Line will be printed"
输出
正如您所看到的,“write-output”由于“throw”命令而未被打印,它已终止。
使用Try/Catch块处理异常
让我们将这段代码写入try/catch块中,这是编程语言中常用的异常处理方法。
示例3
try { if(Get-Service -Name DoesntExist) { Write-Output "Service Found" }else { Write-Output "Service not found" } Write-Output "This Line will be printed" }catch { Write-Output "Error Occured" }
输出
与示例1的输出相同,这里没有使用try/catch块。我们将在几分钟内对脚本进行一些更改,以便更容易地使用try/catch块。
让我们将示例2转换为try/catch块。
示例4
try { if(Get-Service -Name DoesntExist) { Write-Output "Service Found" }else { throw "Service not found" } Write-Output "This Line will be printed" }catch { Write-Output "Error Occured" }
输出
因此,throw命令终止脚本并移动到catch块,并显示异常输出。但是,我们仍然会收到错误消息(红色显示),并且catch输出稍后显示。
将非终止错误转换为终止错误
处理此异常的更好方法是使用ErrorAction参数或$ErrorActionPreference变量将非终止错误转换为终止错误。默认情况下,PowerShell为此变量设置的值为Continue,因此如果发生错误,程序将继续执行。如果我们将此变量或参数值设置为“Stop”,并且cmdlet发生错误,则它会在try块中终止脚本,并在catch块中继续执行。
示例5
try { if(Get-Service -Name DoesntExist -ErrorAction Stop) { Write-Output "Service Found" }else { Write-Output "Service not found" } Write-Output "This Line will be printed" }catch { Write-Host "Error Occured" -f Red }
输出
Error Occured
正如您所看到的,它只显示catch块,因为服务不存在。让我们使用$ErrorActionPreference变量,它作为-ErrorAction参数的替代方案,但适用于整个脚本。
示例6
$ErrorActionPreference = "Stop" try { if(Get-Service -Name DoesntExist) { Write-Output "Service Found" } }catch { Write-Host "Error Occured" -f Red }
输出将与上面相同。
处理实际的错误消息
您可以直接捕获cmdlet生成的错误消息,而不是编写自定义错误消息,如下所示。
示例7
$ErrorActionPreference = "Stop" try { if(Get-Service -Name DoesntExist) { Write-Output "Service Found" } }catch { $_.Exception }