Jump to content

Fehlerunterdrückung mit try/catch


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

folgender Code funktioniert nicht so wie ich es möchte:

 

try
{
Import-Module servermanager | out-null
Add-Windowsfeature RSAT-AD-PowerShell | out-null
Import-Module activedirectory | out-null

cd "AD:\OU=blabla..."
[string]$cn = "blabla" + $_.name
Add-ADGroupMember -Identity ("CN="+$cn+",OU=blabla") -members ("CN="+$name)

Remove-Module activedirectory | out-null
Remove-Windowsfeature RSAT-AD-PowerShell | out-null
Remove-Module servermanager | out-null
}
catch
{
write-log 2 "Error adding computer to ActiveDirectory group" $false $true
}

 

Es sollte an drei Stellen einen Error geben:

  • Bei Add-Windowsfeature => Add-WindowsFeature : Please restart the computer before trying to install more roles/features.
  • Bei Add-ADGroupMember => Computer ist bereits Gruppenmitglied
  • Bei Remove-Windowsfeature => Remove-WindowsFeature : Please restart the computer before trying to install more roles/features.

(Fehler 1 und 3 bleiben dann, wenn das Script produktiv eingesetzt wird, aus).

 

Es wird aber der Fehler bei Add-Windowsfeature trotzdem ausgegeben.

Darauf folgt der Fehler im catch-Block.

Der Fehler bei Remove-Windowsfeature bleibt aus.

 

Eigentlich sollten alle Fehler unterdrückt werden und nur einmal der Fehler im catch-Block dargestellt werden.

 

Freundliche Grüße

xola

Link zu diesem Kommentar

Hallo,

 

also die "Import-Module" Kommandos springen im Fehlerfall erst dann in den "Catch"-Bereich, wenn du sie so verwendest:

 

Import-Module servermanager [b]-ErrorAction Stop[/b]
Import-Module activedirectory [b]-ErrorAction Stop[/b]

 

Un bei dem anderen, der im Fehlerfall trotz Sprung in den Catch trotzdem noch seinen Fehlertext ausgibt, würde ich es mal mit

 

Remove-Windowsfeature RSAT-AD-PowerShell [b]-ErrorAction SilentlyContinue[/b]

 

probieren.

 

Gruß,

Philipp

Link zu diesem Kommentar

Hallo,

 

nö, man kann ruhig einen ganzen ScriptBlock mit Try/Catch "versorgen", um größere Scripts leserlich zu halten...Schließlich werden Try/Catch Strukturen auch oft hierarchisch verschachtelt, wenn man da nicht zusammenfasst wird einem ja schwindelig :)

 

Eine Verbesserung und genaue Information, woher der Fehler kommt und in was der Fehler besteht, wäre z.B. sowas hier:

 

try
{
      $currentAction = "Schritt 1"
Mach-Irgendwas -IrgendeinParameter

      $currentAction = "Schritt 2"
Mach-Nochwas -IrgendeinParameter

      $currentAction = "Schritt 3"
Mach-Waszuletzt -IrgendeinParameter

}
catch [exception]
{
Write-Host ("Fehler bei $currentAction : " + $_.ToString())
}

 

 

Gruß,

Philipp

Link zu diesem Kommentar

Also ich arbeite in PS gerne mit einer Funktion, diese hat mehrere Switchblöcke und im Anschluss kommt eine weitere IF-Abfrage, welche wieder mehrere Switchblöcke hat.

 

Obere teil beinhaltet die Aufgabe - die Funktion wird z.B. mit einem Integer aufgerufen. Jeder Integer steht für eine Aufgabe, im Anschluss wird über die IF-Abfrage die Fehlervariable überprüft

 

z.B. if($Error[0] -ne $null)

sollte also was drinne stehen wird die nächste Switch aufgerufen, hier wird je nach Funktion angegeben wo der Fehler stattfand und zusätzlich der Fehlercode aus der $error. Im Abschluss wird eine Email verschickt und der Skript per Exit beendet.

 

Klingt jetzt alles vielleicht kompliziert, aber da ich mich eher als Leihe sehe finde ich es strukturell sehr nützlich, dazu bekommt man so die Möglichkeit auf jeden Fehler gesondert zu reagieren. Das kann Try/Catch oder Trap halt nicht :)

 

Weiß nicht ob das best Praxis ist, aber für alle umfangreicheren Skripte finde ich etwas vergleichbares als ein "must have".

 

Grüße

 

Hier mal das grobe Gerüst, kann man sich je nach Bedarf anpassen.

Hinweis:

Timestamp ist eine Funktion die einen SQL Timestamp erzeugt

Sendmail ist eine Funktion die eMails abschickt

$errorlog enthält den Pfad für die Logdatei

function Aufruf ($i)
{
   switch ($i)
   {	   		
  	#1. Task
  	1
   	{
           #Hier ist der auszuführende Code
           #Fehlermessage

           $script:error_message=$error[0]
           break
   	}
       #2. Task
       2
       {
           #Hier ist der auszuführende Code
           #Fehlermessage

           $script:error_message=$error[0]
           break
       }
   }
   #Fehlerbearbeitung wird ausgeführt
   if($Error[0] -ne $null)
   {
       $timestamp=timestamp #Hinweis dies ruft den Zeitstempel auf, eigene Funktion
#Fehleraktionen
switch($i)
{
            #1. Task
     1
     {
     #erzeugt Fehlerbeschreibung
     $error_message=$timestamp+"Fehlermeldung ...."+$error_message
     #Schreibt Fehler in ein Log
     $error_message>>$error_log
     break
     }
            #Fehleraktion Blobbackup
            2
            {
            #erzeugt Fehlerbeschreibung
     $error_message=$timestamp+"Fehlermeldung...."+$error_message
     #Schreibt Fehler in ein Log
     $error_message>>$error_log
     break
            }
       }
       #Fehler Email wird versandt
       sendmail #emailfunktion wird aufgerufen
       #Sicherungsskript wird beendet, da Fehler
       exit
   }

}
#Task 1 wird aufgerufen
function (1)
#Task 2 wird aufgerufen
function (2)

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...