2016-03-28 4 views
0

Ich versuche, mit Skript-Blöcken in einer Bibliotheksfunktion zu arbeiten. Ich möchte sicher sein, dass ich Laufzeitfehler im gelieferten Skriptblock zuverlässig erkennen und melden kann. Im folgenden Beispiel erstelle ich einen Skriptblock, der einen Laufzeitfehler verursacht.Wie kann ich eine Ausnahme im Skriptblock abfangen?

Meine Erwartung ist, dass der catch-Block es erfassen und die Fehlermeldung ausgeben wird. Das passiert nicht. Der Fehler wird in roter Schrift an die Konsole ausgegeben, aber die Kontrolle wird nicht an den catch-Block übergeben.

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt") 

$results = '' 

try { 
    $results = & $cmd 
} 
catch { 
    $results += "Error: $($_.Exception.Message)" 
} 

"Results: $results" 

Results: 

PS:> 

Kann mir bitte jemand helfen, den Fehler in diesem Beispiel zu finden?

+0

versuchen fangen nur behandelt __termining errors__. '$ cmd = [ScriptBlock] :: Create (" Holen-Inhalt doesnotexist.txt -ErrorAction Stop ") – Matt

+1

Siehe http://stackoverflow.com/questions/9948517/how-to-stop-a-powershell-script -on-the-first-error und diese http://stackoverflow.com/questions/13820140/how-can-i-rethrow-an-exception-from-catch-block-in-powershell –

+0

@MartinMaat Die Beiträge, die Sie referenziert haben enthielt die Informationen, die ich brauchte. Die Standardfehleraktion von continue ist der Grund dafür, dass mein try catch umgangen wurde. Wenn ich es zu Stop ändere, funktioniert es so, wie ich es erwarte. –

Antwort

0

Ich bin mir nicht ganz sicher, warum Sie so vorgehen. Sie werden den Fehler anzeigen wollen, wenn es passiert, so lassen Sie das in der catch passieren, dann, wenn die Ergebnisse nicht gleich null sind, lassen Sie es die richtigen Ergebnisse anzeigen.

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt") 

$results = '' 

try { 
    $results = & $cmd 
} 
catch { 
    write-error $_ 
} 

if($results -ne $null){ 
    write-host "Results: $results" 
} 
<#else{ 
    #Error handling here, or have this action happen in the catch 
}#> 
+0

Ich stimme zu, es gibt mehrere Möglichkeiten, die Nachricht zu behandeln. Das Problem besteht darin, dass dieser Fehler den catch-Block überhaupt nicht aufruft. Das ist der Teil, an dem ich festhalte. –

+0

Vielleicht müssen Sie den Versuch/Fang stattdessen in Ihrem Skriptblock setzen? Ich glaube, das wird nur funktionieren, wenn es sich um einen terminierenden Fehler handelt, also müssen Sie vielleicht etwas wie einen Testpfad und nachfolgende if-Anweisungen machen, um so zu verfahren. Ich denke, es wäre einfacher, Sie in die richtige Richtung zu weisen, wenn ich den genauen Anwendungsfall wüsste. – nkasco