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
}

输出

更新于:2022年2月18日

浏览量:10K+

启动你的职业生涯

完成课程获得认证

开始学习
广告