我有一种情况,我必须在我的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类MyCustomException1
和MyCustomException2
,有没有办法在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但它没有回答我的问题。
答案 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"
}