Hallo zusammen,
ich wollte hier einmal einen Code-Abschnitt posten, den ich in meiner Standard-Error Behandlung benutze. Vielleicht ist das für den einen oder anderen ein Anreiz ebenfalls einen Standard für die Fehlerbehandlung hier zu posten oder überhaupt anzustreben.
Wenn er gefällt könnt ihr Ihn in die Best-Practices gerne aufnehmen
Folgende Situation:
*************************************************
Sub MeinFehler
On Error Goto ErrorGeneral
....
goto ExitSub
'------ Fehlerbehandlung ------
ErrorGeneral:
etext = ErrorHandlingLocal("Irgendein Kommentar", <Level>)
Resume ExitSub
ExitSub:
End Sub
*************************************************
Wir fangen also alle Fehler auf, die wir im Code selbst nicht anderweitig behandeln. Der Grund weshalb ich mit der Sprungmarke ExitSub: arbeite ist der, das ich einen Punkt haben möchte (egal ob Fehler oder nicht), bei dem die Sub-Verarbeitung beendet wird und nicht mehrere im Code verteilte Punkte (mit 'Exit Sub').
Die Funktion 'ErrorHandlingLocal' heißt so, weil Sie eher für Programmcode gedacht ist, der von einem Benutzer ausgeführt wird, z.B. über einen Aktionsknopf.
Bitte bei der Nutzung innerhalb einer Function darauf achten, das im 'ErrorGeneral'-Abschnitt auch ein Rückgabewert definiert werden sollte, der dem aufrufenden Programmteil die korrekte Weiterarbeit (oder den korrekten Abbruch) ermöglicht.
Hier meine Funktion:
*************************************************
'========================================================================================
' ErrorHandlingLocal V2.0.0
'
' Purpose - creates a error message string which summarizes an error
' - prints the string
' - is intended for standard error handling for local functions
'
' Parameters - ErrorLocation
'
' Returns - error message string
'
' Created CHG (18.01.2005)
' Modified CHG (02.02.2006)
'========================================================================================
Function ErrorHandlingLocal(ErrorLocation As String, HandlingType As String) As String
Const TYPE_NONE = "0"
Const TYPE_PRINT = "1"
Const TYPE_DIALOG = "2"
Const ICON_ERROR = 64
Const DIALOG_TITLE_ERROR = "Error"
Dim Title As String
Dim ErrorLine As String
Dim ErrorType As String
Dim ErrorNr As String
Dim ErrorDescription As String
'============================================== BEGIN ==============================================
Title = "ERROR - " & ErrorLocation
ErrorType = Error
ErrorNr = " (" & Err & ")"
ErrorLine = " - Line: " & Erl
ErrorDescription = Title & ": " & ErrorType & ErrorNr & ErrorLine
Select Case HandlingType
Case Type_NONE: ' do nothing
Case TYPE_PRINT: Print ErrorDescription ' print error
Case TYPE_DIALOG: Messagebox ErrorDescription, ICON_ERROR, DIALOG_TITLE_ERROR ' open dialog
End Select
ErrorHandlingLocal = ErrorDescription
Goto ExitSub
'============================================== END ==============================================
ExitSub:
End Function
*************************************************
Die Funktion macht also hauptsächlich folgendes
- konstruiert einen Fehlertext aus dem übergebenen Parameter und den Fehlerinfos
- gibt den Fehlertext zurück
- Ausgabe des Fehlertextes in die Statuszeile oder als Messagebox
Meistens ergänze ich 'ErrorGeneral' noch durch eigene Fehlernummern, die ich vorher in einer Konstante definiert habe ungefähr so:
*************************************************
Sub MeinFehler
Const ERROR_BASIC_NUMBER = 1000
Const ERROR_DIVBYZERO_NUMBER = ERROR_BASIC_NUMBER + 1
On Error Goto ErrorGeneral
On Error ERROR_DIVBYZERO_NUMBER Goto ErrorDivByZero
....
goto ExitSub
'------ Fehlerbehandlung ------
ErrorGeneral:
etext = ErrorHandlingLocal("Irgendein Kommentar", <Level>)
Resume ExitSub
ErrorDivByZero:
...
Resume ExitSub
ExitSub:
End Sub
*************************************************
Ich weiß, das dies keine Atomphysik ist, aber für mich war diese Funktion einer meiner Schritte, um endlich ein standardisiertes Verfahren für mein Error Handling einzuführen. Vorher habe ich das Thema ein wenig stiefmütterlich behandelt, inzwischen kann ich meine Fehlerbehandlung fast mit "Copy&Paste" in neuen Code einbauen.
Ich hoffe das die Anregung euch dazu animiert eure Standards offenzulegen
Grüße
C.