2017-07-26 1 views
0

Ich habe eine Situation, wo ich mehr benutzerdefinierten Ausnahmen in einem try-Block in meinem Powershell-Skript so etwas wie untenmehr als eine benutzerdefinierte Ausnahme in Powershell zu werfen

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 
} 

Gibt es eine Möglichkeit, es zu tun in Powershell werfen muß ohne die .net Klasse MyCustomException1 und MyCustomException2 zu schreiben. Ich muss keine Informationen in der Klasse speichern, aber ich brauche nur einen Weg, um die Ausnahmen zu unterscheiden. Ich könnte tun, wie unten, aber ich frage mich nur, ob etwas sauberer.

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

Anmerkung: Ich habe bereits unter Stack-Überlauf Fragen geprüft: powershell-creating-a-custom-exceptionpowershell-2-0-try-catch-how-to-access-the-exceptionpowershell-creating-and-throwing-new-exception Aber es ist meine Frage nicht beantwortet.

Antwort

0

Dank @BenH und @ TheIncorrigible1 für Ihre Zeiger auf das Erstellen von Klassen und Ausnahmen. Unten ist ein Beispielcode, um dies zu erreichen, wenn jemand anderes auch das gleiche sucht.

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" 
} 
1

Sie können die FullyQualifiedErrorID-Eigenschaft auf der $error-Variable betrachten, um die Zeichenfolge aus der throw-Anweisung abzurufen.

try {throw "b"} 
catch { 
    if ($error[0].FullyQualifiedErrorID -eq "a") {'You found error "a"'} 
    if ($error[0].FullyQualifiedErrorID -eq "b") {'You found error "b"'} 
} 

Aber es sieht aus wie Sie nicht wirklich Try wollen Catch aber nicht beendet, Fehler zu machen. Sie könnten dazu Write-Error verwenden.

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

Ich möchte die Fehler in verschiedenen Catch-Blöcken anstelle von einem Catch-Block und dann setzen, wenn Bedingungen. Ich muss einige Geschäftslogik in den Catch-Blöcken durchführen. Um die Frage einfach zu machen ich einfach den write-host Aussagen – Pramod

+0

@Pramod Sie erhalten eine 'catch' pro Fehlertyp, aber Sie sagten Sie wollten nicht Fehlertypen machen. – BenH

+0

Ja, ich möchte nur wissen, ob es einen Weg gibt, einen "Fangblock" pro Fehlertyp zu bekommen, ohne '' net' Klassen für 'MyCustomException1' und' MyCustomException2' zu erstellen. – Pramod

1

Sie können $PSCmdlet.ThrowTerminatingError verwenden und ein eigenes ErrorRecord-Objekt definieren.

Hier ist another useful article zur Fehlerbehandlung in PowerShell.

Für Ihre Frage zu benutzerdefinierten Klassen, können Sie auch Ihre eigenen Klassen in pSV5 nutzen +


Nach der Lektüre Ihrer Kommentare, können Sie herausfinden welche Fehler Sie mithilfe behandeln möchten:

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

Dies gibt Ihnen die Klasse des Fehlers, der ausgelöst wird. Gepaart mit:

Sie können auch sehen, was das System meldet.

Verwandte Themen