在PowerShell中抛出多个自定义异常。

22 浏览
0 Comments

在PowerShell中抛出多个自定义异常。

我有一个情况,在我的PowerShell脚本中的try块中我需要抛出多个自定义异常,像下面这样:

try {
    if (!$condition1) {
        throw [MyCustomException1] "Error1"
    }
    if (!$condition2) {
        throw [MyCustomException2] "Error2"
    }
}catch [MyCustomException1] {
    #执行一些业务逻辑
}catch [MyCustomException2] {
    #执行一些其他业务逻辑
}catch{
    #执行其他操作
}

是否有一种在PowerShell中实现而不编写.NET类MyCustomException1MyCustomException2的方法。我不必在类中存储任何信息,但我只需要一种区分异常的方法。

我可以像下面这样做,但我只是想知道是否有更简洁的方法。

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 但它们没有解答我的问题。

0
0 Comments

在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 }

可以查看系统报告的错误信息。

0
0 Comments

问题:在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)

0
0 Comments

在这段代码中,我们定义了两个自定义异常类: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中抛出和捕获多个自定义异常的问题。

0