Fehlermeldungen auswerten und unterdrücken
Wenn in Powershell ein Fehler auftritt, wird normalerweise eine Fehlermeldung in Form eines ErrorRecord-Objekts ausgegeben. Alle Fehler werden dabei in einem Array namens $Error protokolliert. Das erste Element des Arrays enthält immer die letzte Fehlermeldung. Geben Sie z.B. 1/0 ein, wird ein Division durch Null-Fehler geworfen.
1/0
> Es wurde versucht, durch 0 (null) zu teilen.
$Error[0] | Select-Object -Property *
> PSMessageDetails :
> Exception : System.Management.Automation.RuntimeException: […gekürzt…]
> TargetObject :
> CategoryInfo : NotSpecified: (:) [], RuntimeException
> FullyQualifiedErrorId : RuntimeException
> ErrorDetails :
> InvocationInfo : System.Management.Automation.InvocationInfo ScriptStackTrace : bei <ScriptBlock>, <Keine Datei>: Zeile 1
> PipelineIterationInfo : {}
Tatsächlich können je nach Fehler unterschiedliche Eigenschaften im Fehlerobjekt auftauchen. Die Exception (Ausnahme) ist selbst ein Objekt, das weitere Informationen zur Verfügung stellt. Exception.Message beinhaltet z.B. die reine Textmeldung, die ausgegeben wurde.
$Error[0].Exception.Message
> Es wurde versucht, durch 0 (null) zu teilen.
Die $Error-Variable
Die Variable $Error ist ein Array, das alle Fehler enthält, die von Powershell ausgelöst ("ge-worfen") wurden. Immer, wenn ein neuer Fehler auftritt, wird das ErrorRecord-Objekt in das Listenelement mit dem Index 0 eingefügt, und alle anderen Objekte rutschen im Array einen Index weiter. Dadurch beinhaltet $Error[0] immer den letzten ausgelösten Fehler.
Die Anzahl der Fehler, die in $Error vorgehalten werden, ist endlich. Sie wird bestimmt durch die Standardvariable $MaximumErrorCount. Standardmäßig steht $Maximumerrorcount auf 256, kann aber bis 32768 hochgesetzt werden.
Um $Error zurückzusetzen, muss die Methode $Error.Clear() verwendet werden. Um die Anzahl der Fehler im Array zu bestimmen, rufen Sie $Error.Count auf.
Über den Typ von Exception oder InnerException können Sie ermitteln, was für ein Typ von Fehler ausgelöst wurde.
$error[0].exception.gettype().Name
> RuntimeException
$error[0].Exception.InnerException.GetType().Name
> DivideByZeroException
Die Fehlertypen können Sie verwenden, um in Try-Catch Blöcken (s. Abschnitt Unbehandelte Fehler abfangen mit Try-Catch-Finally) spezifische Fehler abzufangen.