在powershell中抛出多个自定义异常

时间:2017-07-26 14:49:33

标签: powershell exception-handling

我有一种情况,我必须在我的powershell脚本中的try块中抛出多个自定义异常,如下所示

try {
    if (!$condition1) {
        throw [MyCustomException1] "Error1"
    }
    if (!$condition2) {
        throw [MyCustomException2] "Error2"
    }
}catch [MyCustomException1] {
    #do some business logic
}catch [MyCustomException2] {
    #do some other business logic
}catch{
    #do something else
}

如果没有编写.net类MyCustomException1MyCustomException2,有没有办法在powershell中执行此操作。我不必在课堂上存储任何信息,但我只需要一种方法来区分异常。 我可以这样做,但我只是想知道是否更清洁。

try {
    if (!$condition1) {
        throw "Error1"
    }
    if (!$condition2) {
        throw "Error2"
    }
}catch {
    if($_.tostring() -eq "Error1"){
        Write-Host "first exception"
    }elseif($_.tostring() -eq "Error2"){
        Write-Host "Second exception"
    }else {
        Write-Host "third exception"
    }
}

注意:我已经检查了以下堆栈溢出问题:powershell-creating-a-custom-exception powershell-2-0-try-catch-how-to-access-the-exception powershell-creating-and-throwing-new-exception但它没有回答我的问题。

3 个答案:

答案 0 :(得分:1)

您可以查看FullyQualifiedErrorID变量上的$error属性,以获取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"'}
}

但看起来你真的不想Try Catch而是要做出非终止错误。您可以使用Write-Error执行此操作。

if (!$condition1) {
    Write-Error "Error1"
}
if (!$condition2) {
    Write-Error "Error2"
}

答案 1 :(得分:1)

您可以使用$PSCmdlet.ThrowTerminatingError并定义自己的ErrorRecord对象。

这里有关于PowerShell中错误处理的another useful article

关于自定义类的问题,您也可以在PSv5 +

中使用自己的类

阅读完评论后,您可以使用以下方法找出要处理的错误

Catch { "[$($_.Exception.GetType().FullName)]" }

这为您提供了抛出的错误类。配对:

Catch { $_.Exception.Message }

您还可以查看系统正在报告的内容。

答案 2 :(得分:0)

感谢@BenH和@TheIncorrigible1提供有关创建类和异常的指示。下面是一个示例代码来实现这一点,如果其他人也在寻找相同的。

class MyEXCP1: System.Exception{
    $Emessage
    MyEXCP1([string]$msg){
        $this.Emessage=$msg
    }
}
class MyEXCP2: System.Exception{
    $Emessage
    MyEXCP2([string]$msg){
        $this.Emessage=$msg
    }
}
$var=2
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"
}