ich habe eine Outlook 2003 Formularlösung zur Wartung übernommen, und bin etwas verwundert, dass beim Auftreten eines Fehlers das Script einfach die Ausführung abbricht, und keine Fehlermeldung kommt.
In der fraglichen Routine (Item_Write) ist kein On Error Resume Next, auch nicht in den aufgerufenen Sub-Routinen. In anderen schon, die spielen aber beim Speichern direkt keine Rolle.
Wie kann ich Item_Write soweit absichern, dass ich 1. eine Fehlermeldung bekomme, und 2. daraufhin den Speichervorgang abbrechen kann (natürlich mit Item_Write = false, aber ich muss zuerst wissen, dass ein Fehler aufgetreten ist und will nicht jede Zeile mit einer If Err.Number <> 0 versehen.
Das folgende Skript demonstriert meinen Vorschlag für die Fehlerbehandlung unter C|WScript. Ich kenne mich mit Outlook nicht aus, hoffe aber, dass die Technik übertragbar ist.
' VbsError.vbs - VBScript Fehlerbehandlung ' Reklame: ' (1) Kein 'Absturz' beim Kunden ' (2) Vollständige Fehlermeldung (Zeilennummer) beim Entwickeln ' (3) Wechsel zwischen (1) und (2) duch /dbg Argument ' (4) Durch Wrapper können grosse Codemengen *ohne* OERN gekapselt werden ' (All or Nothing) ' Grundregeln: ' (1) Küchendienst für ein globales OERN ' (2) Je 10,00 Euro in die Kaffeekasse ab der dritten Zeile zwischen OERN und OEG0
' Nicht ohne mein "Option Explicit" Option Explicit
' Globals Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" ) Dim goWAN : Set goWAN = WScript.Arguments.Named Dim gaErr : gaErr = Array( 0, "" )
' Dispatch Dim nRet If goWAN.Exists( "dbg" ) Then ' Mit Abbruch/Fehlermeldung/Zeilennummer beim Entwickeln nRet = doMain() Else ' Mit Entschuldigung und ohne Abbruch beim Kunden On Error Resume Next nRet = doMain() gaErr = Array( Err.Number, Err.Description ) On Error GoTo 0 If 0 <> gaErr( 0 ) Then WScript.Echo "Entschuldigung! Aber kein Absturz!" End If End If WScript.Quit nRet
' Hauptprogramm Function doMain() doMain = 1 ' wird schon schiefgehen WScript.Echo "Main Start" lesen If goWAN.Exists( "main" ) Then Err.Raise 4711, "doMain", "verzambelt" Dim bOk : bOk = schreiben() If Not bOk Then WScript.Echo "Schreiben hat nicht geklappt, aber rechnen werden wir doch können!" End If rechnen WScript.Echo "Main Ende" doMain = 0 ' hat doch funktioniert End Function
Sub lesen() WScript.Echo " Lesen Start" If goWAN.Exists( "lesen" ) Then Err.Raise 4711, "lesen", "verzembelt" WScript.Echo " Lesen Ende" End Sub
Function schreiben() schreiben = False WScript.Echo " Schreiben Wrapper Start" On Error Resume Next schreibenA gaErr = Array( Err.Number, Err.Description ) On Error GoTo 0 If 0 = gaErr( 0 ) Then schreiben = True Else WScript.Echo " Probleme bei Schreiben:", Join( gaErr ) End If WScript.Echo " Schreiben Wrapper Ende" End Function
Sub rechnen() WScript.Echo " Rechnen Start" If goWAN.Exists( "rechnen" ) Then Err.Raise 4711, "rechnen", "verzimbelt" WScript.Echo " Rechnen Ende" End Sub
Sub schreibenA() WScript.Echo " Schreiben A Start" ' 200 gefährliche Zeilen, 100 Aufrufe gefährlicher Routinen If goWAN.Exists( "bingo" ) Then Err.Raise 4711, "bingo", "verzombelt" ' 200 gefährliche Zeilen, 100 Aufrufe gefährlicher Routinen WScript.Echo " Schreiben A Ende" End Sub
Demos zur Verdeutlichung: (1) Kein 'Absturz' beim Kunden
cscript VbsError.vbs /lesen Main Start Lesen Start Entschuldigung! Aber kein Absturz!
(2) Vollständige Fehlermeldung (Zeilennummer) beim Entwickeln
(4) Durch Wrapper können grosse Codemengen *ohne* OERN gekapselt werden
cscript VbsError.vbs /bingo Main Start Lesen Start Lesen Ende Schreiben Wrapper Start Schreiben A Start Probleme bei Schreiben: 4711 verzombelt Schreiben Wrapper Ende Schreiben hat nicht geklappt, aber rechnen werden wir doch können! Rechnen Start Rechnen Ende Main Ende
Wenn alles glatt geht:
cscript VbsError.vbs Main Start Lesen Start Lesen Ende Schreiben Wrapper Start Schreiben A Start Schreiben A Ende Schreiben Wrapper Ende Rechnen Start Rechnen Ende Main Ende