在PowerShell中抛出多个自定义异常。
在PowerShell中抛出多个自定义异常。
我有一个情况,在我的PowerShell脚本中的try块中我需要抛出多个自定义异常,像下面这样:
try { if (!$condition1) { throw [MyCustomException1] "Error1" } if (!$condition2) { throw [MyCustomException2] "Error2" } }catch [MyCustomException1] { #执行一些业务逻辑 }catch [MyCustomException2] { #执行一些其他业务逻辑 }catch{ #执行其他操作 }
是否有一种在PowerShell中实现而不编写.NET类MyCustomException1
和MyCustomException2
的方法。我不必在类中存储任何信息,但我只需要一种区分异常的方法。
我可以像下面这样做,但我只是想知道是否有更简洁的方法。
try { if (!$condition1) { throw "Error1" } if (!$condition2) { throw "Error2" } }catch { if($_.tostring() -eq "Error1"){ Write-Host "第一个异常" }elseif($_.tostring() -eq "Error2"){ Write-Host "第二个异常" }else { Write-Host "第三个异常" } }
注意:我已经查看了以下Stack Overflow问题:powershell-creating-a-custom-exception powershell-2-0-try-catch-how-to-access-the-exception powershell-creating-and-throwing-new-exception 但它们没有解答我的问题。
在PowerShell中,如果需要抛出多个自定义异常,可以使用$PSCmdlet.ThrowTerminatingError方法,并定义自己的ErrorRecord对象。这样可以更灵活地处理异常情况。
此外,关于PowerShell中的错误处理,可以参考一篇有用的文章,链接为https://kevinmarquette.github.io/2017-04-10-Powershell-exceptions-everything-you-ever-wanted-to-know/#pscmdletthrowterminatingerror。
另外,对于自定义类的问题,从PSv5开始,也可以在PowerShell中使用自己定义的类。
通过阅读评论,可以发现可以使用以下代码来确定要处理的错误类型:
Catch { "[$($_.Exception.GetType().FullName)]" }
该代码可以获取被抛出的错误的类。配合以下代码:
Catch { $_.Exception.Message }
可以查看系统报告的错误信息。
问题:在PowerShell中抛出多个自定义异常的原因和解决方法
在PowerShell中,如果想要捕获不同类型的错误并在不同的catch块中执行相应的业务逻辑,可以使用自定义异常。下面是解决该问题的方法:
1. 使用$error变量的FullyQualifiedErrorID属性来获取throw语句中的字符串。
try { throw "b" } catch { if ($error[0].FullyQualifiedErrorID -eq "a") { 'You found error "a"' } if ($error[0].FullyQualifiedErrorID -eq "b") { 'You found error "b"' } }
2. 使用Write-Error命令来生成非终止性错误。
if (!$condition1) { Write-Error "Error1" } if (!$condition2) { Write-Error "Error2" }
如果想要在不同的catch块中捕获不同类型的错误,而不是使用if条件语句,可以使用自定义异常类。以下是一些内置的异常类型:
[System.Management.Automation.CommandNotFoundException], [System.SystemException], [System.Net.WebException], [System.IO.IOException]
如果不想使用预定义的异常类型,可以创建自定义的异常类。可以参考这个问题来了解如何在PowerShell中创建类:[链接](https://stackoverflow.com/questions/59819)
在这段代码中,我们定义了两个自定义异常类:MyEXCP1和MyEXCP2。这些类都继承自System.Exception类,并拥有一个变量$Emessage和一个构造函数,用于传递异常消息。
在try块中,我们使用if语句判断变量$var的值。如果$var等于1,我们会抛出MyEXCP1异常;如果$var等于2,我们会抛出MyEXCP2异常。
在catch块中,我们使用catch [MyEXCP1]来捕获MyEXCP1异常,并输出"Exception 1 thrown";使用catch [MyEXCP2]来捕获MyEXCP2异常,并输出"Exception 2 thrown"。
这段代码的目的是演示如何在PowerShell中抛出和捕获多个自定义异常。
问题的原因是在catch块中,只能捕获一种类型的异常。如果我们在try块中抛出了MyEXCP1异常,catch块中的catch [MyEXCP2]将无法捕获到异常。同样地,如果我们在try块中抛出了MyEXCP2异常,catch块中的catch [MyEXCP1]也无法捕获到异常。
为了解决这个问题,我们可以使用多个catch块来捕获不同类型的异常。修改代码如下:
try{ if($var -eq 1){ throw [MyEXCP1]"Exception 1" } if($var -eq 2){ throw [MyEXCP2]"Exception 2" } }catch [MyEXCP1]{ Write-Output "Exception 1 thrown" }catch [MyEXCP2]{ Write-Output "Exception 2 thrown" }
这样,无论抛出的异常是MyEXCP1还是MyEXCP2,都能够被相应的catch块捕获到,并输出对应的异常消息。
通过以上的修改,我们成功解决了在PowerShell中抛出和捕获多个自定义异常的问题。