6 Replies Latest reply on Mar 28, 2012 6:17 AM by _Mel_

    Ausnahmebehandlung

    ZellOr Apprentice
      Hallo zusammen,

      gibt es in DSM eine Variable oder ein Befehl, mit dem man ermitteln kann, ob der letzte Befehl ohne Fehler bzw. erfolgreich ausgeführt wurde?
      (Ich habe schon mit der Variable "_LAST_ERROR_TEXT" geliebäugelt...aber die wird beim aufrufen des nächsten Befehls nicht automatisch zurückgesetzt )

      Das ganze stell Ich mir so vor:


      RemoveFolder('...',iSubDirs)/TS <- Hier tritt ein Problem auf (z.B. ein MoveAtNextStart('...','') wurde ausgelöst)
      If %LAST_COMMAND_SUCCESSFUL%=FALSE
      MsgBox
        Es ist eine Fehler aufgetreten. Möglicherweise handelt es sich um ein ernsthaftes Problem.
      EndProc
      Else
      ...


      Danke und Gruß
        • 1. Re: Ausnahmebehandlung
          Frank.Scholer Master
          Hallo ZellOr,

          nicht dass ich wüsste... mit _LAST_ERROR_TEXT kriegst du halt die letzte Fehlermeldung, mit _ERROR_SEVERITY den Schweregrad des letzten Fehlers (Wertebereich 1-3).

          Beide werden aber meines Wissens nach nicht zurückgesetzt bei einem erfolgreich ausgeführten Befehl (was ja dem Namen nach auch OK - es handelt sich ja um den letzten aufgetretenen Fehler), d.h. du müsstest sie explizit vor Ausführung deines kritischen Befehls setzen (auf leer bzw. auf 0).

          HTH, Gruß Frank
          • 2. Re: Ausnahmebehandlung
            Markus.Zierer Expert
            Der einzige Befehl, welcher mir da jetzt so einfällt wäre "ExecuteEx". Der Schreibt den ReturnCode von der ausgeführten Anwendung in ne Variable, welche Du dann wiederum auswerten kannst.

            Aber ich denke ich weis schon, in welche Richtung deine Denkweise geht. Und Leider muss ich Dich da gleich enttäuschen. Nein, soetwas gibt es nicht in der DSM. Das wäre auch, wenn überhaupt, nur sehr Aufwendig umsetzbar. Wenn Du eine Fehlerbehandlung in deinen Scripts haben willst, musst Du Dir diese selber bauen. Das geht aber i.d.R. einfacher als man zuerst mal denkt. Es gibt da ja nicht allzuviele Möglichkeiten. Prinzipiell wirkt sich alles auf einem System entweder auf das Dateisystem oder auf die Registry aus. Und beides kannst Du mit NetInstall Script Befehlen abfragen und somit auch prüfen. Man muss nur etwas kreativ sein. Das ist alles.

            Für dein Beispiel wäre das z.B. dass Du nach dem Remove Folder eine "If" Abfrage einbaust, welche prüft, ob der Ordner noch Vorhanden ist. Falls das der Fall ist, kannst Du mittels dieser Condition dann wiederum eine Aktion auslösen. Ne Messeage Box an den User, eine Mail an den Admin, erneutes Löschen usw. Der Phantasie sind da nur wenig Grenzen gesetzt.

            Genau so kannst Du natürlich auf das Vorhandensein von Werten in der Registry prüfen.

            Oder auch die genaue Version einer lokal vorhandenen Datei usw.

            Du siehst also, man kann da schon ordentlich was machen. Wenn man denn möchte. Aber das ganze Thema Fehlerbehandlung kann ziemlich schnell, ziemlich komplex werden. Von daher würde ich mir das sehr genau überlegen. Denn was auf den ersten Blick Sinnvoll aussieht kann sich bei genauerem Hinsehen als ineffizient erweisen, wenn man den Aufwand dem Gewinn gegenüber stellt.
            • 3. Re: Ausnahmebehandlung
              Frank.Scholer Master
              Hi nochmal,

              ich finde die Idee nicht so verkehrt... in der PowerShell gibt's z.B. auch die eingebaute Variable $? die automatisch entweder True oder False enthält, je nachdem ob beim letzten ausgeführten Befehl ein Fehler aufgetreten ist oder nicht...

              Könnte man sich auch für DSM vorstellen (aber vorstellen kann ich mir recht viel ;-)...

              Grüße Frank
              • 4. Re: Ausnahmebehandlung
                Markus.Zierer Expert
                Hm stimmt.

                Ne Variable, die einfach nen boolean Wert enthält, ob der vorher ausgeführte Befehl erfolgreich war oder eben nicht, wäre gar nicht mal schlecht.
                • 5. Re: Ausnahmebehandlung
                  ZellOr Apprentice
                  Hi,

                  @Markus: Das ist schon klar das man in Prinzip (fast) alles über das Dateisystem/die Registry abfragen kann (ggf. noch mit WMI), umso Fehler abzufangen. Nichtsdesotrotz fände Ich so ne schlichte Lösung wie war der letzte Befehl erfolgreich oder nicht schon schöner. Trotzdem danke für deine gedankengänge!

                  ps. Das dass nur sehr Aufwendig umsetzbar ist mag Ich zu bezweifeln.


                  Func RemoveFolder
                  Ggf. Variable zurücksetzen
                  (Hier passiert die eigentliche Funktion)
                  Erfolg oder Misserfolg in die Variable schreiben
                  FuncEnd


                  @Franke: Danke das Du Dir das auch vorstellen kannst. Ich meine, das gehört doch zu einer vernünftigen Skriptsprache!
                  • 6. Re: Ausnahmebehandlung
                    _Mel_ Master
                    man kann die variablen ja auch selber vor dem befehl einfach zurücksetzen.
                    das größere problem sind die befehle, bei denen, wenn sie fehlschlagen, das paket sofort auf rot geht.

                    wer sich die preview/beta für die 7.1 angeschaut hat, dem ist vielleicht aufgefallen, daß man die fehlerbehandlung selber übernehmen kann und es dazu ein paar neue variablen gibt:
                    _LAST_ERROR_VALUE
                    _LAST_ERROR_VALUE_HEX
                    _LAST_ERROR

                    die werden alle nicht automatisch zurückgesetzt, damit man sowas machen kann
                    set _LAST_ERROR_VALUE% = 0
                    Befehl1 (+Continue on error)
                    Befehl2 (+Continue on error)
                    Befehl3 (+Continue on error)
                    Befehl4 (+Continue on error)
                    if %_LAST_ERROR_VALUE% != 0
                    fehlerbehandlung

                    d.h. man kann durch dieses verhalten einfach abfragen ob irgendein befehl fehlgeschlagen ist, was nicht gehen würde, wenn der wert zurückgesetzt würde.