... das bleibt Dir leider nicht erspart. Mir ist das passiert als ich ein riesiges Modul mit über 6.000 Codezeilen teilen musste. Da die Applikation zZt 20.000 Zeilen hat schreckt mich das jetzt nicht mehr. Iregndwie hab' ich das damals an einem Abend durchgezogen.
Restliche Lücken kannst Du auch mit der Zentralen Fehlerroutine abfangen - immer wenn ein Aufruf ohne optionalen Parameter kommt einen Logeintrag anlegen. Mit etwas Glück kann man die betreffende Person zeitnah fragen was sie gerade getan hat und so den fehlenden Eintrag finden.
Ein automatisiertes Anlegen des Fehleraufrufs ist vermutlich nur in extrem großen Umgebungen notwendig. Dazu müsste man die Module in eine Textdatei kopieren und dann ein Skript drüberjagen, das Zeile für Zeile nach Funktions/Sub-Starts sucht und dann die Fehlerroutine entsprechend anpasst - ehrlich gesagt: bis das Skript richtig arbeitet hat man's vermutlich schon per Hand geschafft.
Meine On-Error-Anweisungen sehen so aus:
Code: Alles auswählen
Sub Artikel_loeschen(oEvent)
on error goto EH
...
exit sub
EH:
call EH("Sub TMDB.Bestellungen.Artikel_loeschen(oEvent)")
end sub
Der Errorhandler selbst dann so:
Code: Alles auswählen
'*-------------------- ERRORHANDLER -------------------------------------------------------------------------------------------------------------------
sub EH(optional sString, optional NO_MSG)
' setzt den Text der Titelzeile falls es sString nicht gibt
if ismissing(sString) then
sString = "Fehler aufgetreten"
else
if len(sString) > 60 then
sString = mid(sString,1,53) & "..."
end if
end if
' falls der Fehler angezeigt werden soll (wenn NO_MSG _FEHLT_ ist das der Fall!) wird er angezeigt
if ismissing(NO_MSG) then
MsgBox "Fehler: " & sString & CHR(13) & "Fehler " & ERR & ": " & ERROR$ & CHR(13) & "In Zeile : " & ERL & CHR(13) & NOW,16,sString
end if
' Anlegen des Fehlerlogs - hier kann der ERR-Wert genutzt werden um Fehler zu kategorisieren
dim sTmp
if ERR = 12 then
sTmp = "Fehler " & ERR & ": " & ERROR$ & CHR(13) & sString & CHR(13) & "In Zeile : " & ERL
call TOOL_LogeintragAnlegen("Opt_Expl_Var_Fehler",sTmp)
else
sTmp = "Fehler " & ERR & ": " & ERROR$ & CHR(13) & sString & CHR(13) & "In Zeile : " & ERL
call TOOL_LogeintragAnlegen(cstr("EH_" & ERR),sTmp)
end if
end sub
Das Tool "TOOL_LogeintragAnlegen" sieht dann etwa so aus:
Code: Alles auswählen
sub TOOL_LogeintragAnlegen(sLogtyp, sMessage, optional bBox)
' Letzte Chance das Fehlergeschehen zu loggen wäre ein Logfile, daher: falls nochmal ein Fehler auftritt: PrintErrorToFile
on error goto PrintErrorToFile
' Hier werden die Sonderzeichen aus dem Fehlertext entfernt, die ein Problem machen wenn sie unmaskiert in einem MySQL-Statement vorkommen
' Also ' \ und "
sLogtyp = replace(sLogtyp , "'", "[A39]")
sLogtyp = replace(sLogtyp , "\", "[A92]")
sLogtyp = replace(sLogtyp , chr$(34), "[A34]")
sMessage = replace(sMessage , "'", "[A39]")
sMessage = replace(sMessage , "\", "[A92]")
sMessage = replace(sMessage , chr$(34), "[A34]")
if not ismissing(bBox) then
msgbox "Folgender Fehler wird geloggt:" & chr(10) & sLogtyp & chr(10) & sMessage
end if
dim oStatement, sSQL
' Datenbank wird verbunden
If isNull(ThisDatabaseDocument.CurrentController.ActiveConnection) Then
ThisDatabaseDocument.CurrentController.Connect
End If
' Statement wird erstellt, die Programm-Versionsangabe kommt aus der globalen Variable gsDB_Version
oStatement = ThisDatabaseDocument.CurrentController.ActiveConnection.createStatement
sSQL = "INSERT INTO `databaseX`.`t_logs` (id_logs, LogTyp, Zeit, Message, Version) " & _
"VALUES (NULL, '" & sLogtyp & "', Current_Timestamp(), '" & sMessage & "', '" & left(gsDB_Version,44) & "' );"
oStatement.executeUpdate(sSQL)
exit sub
PrintErrorToFile:
select case GetGUIType
case 4
if fileexists(converttourl("/mnt/share_X/Programme/DB/Errors/")) then
shell ("bash -c 'echo " & chr$(34) & now() & ": " & thiscomponent.location & chr$(34) & " >> /mnt/share_X/Programme/DB/Errors/FehlerLog'" ,, true)
sSQL = "bash -c 'echo " & chr$(34) & now() & ": " & sSQL & chr$(34) & " >> /mnt/share_X/Programme/DB/Errors/FehlerLog'"
shell ( sSQL ,, true)
sSQL = "bash -c 'echo " & chr$(34) & now() & ": " & "Fehler " & Err & ": " & Error$ & chr(13) & "In line : " & Erl & chr(13) & Now & chr$(34) & " >> /mnt/share_X/Programme/DB/Errors/FehlerLog'"
shell ( sSQL ,, true)
shell ("bash -c 'echo " & chr$(34) & now() & " ------------ " & chr$(34) & " >> /mnt/share_X/Programme/DB/Errors/FehlerLog'" ,, true)
else
' share_X kann nicht gefunden werden - Netzwerk ist vermutlich nicht verfuegbar - es bleibt zu hoffen, dass der User zum Telefon
' greift und die IT-Abteilung informiert ...
' Noetigenfalls koennte man das Logfile lokal im Userverzeichnis unter ~/FehlerLog speichern, oder auf /var/tmp/FehlerLogs, von
' dort koennte ein Admin per ssh das Logfile regelmaessig kontrollieren --- bigbrotheriswatchingyou
msgbox "/mnt/share_X/Programme/DB/Errors/ existiert nicht - ein Fehlerlog kann daher NICHT erstellt werden!" & chr$(10) & "Die Fehlermeldung waere:" & chr$(10) & chr$(34) & now() & ": " & "Fehler " & Err & ": " & Error$ & chr(13) & "In line : " & Erl & chr(13) & Now & chr$(34)
end if
case else
' hier koennte man fuer Windosen ein PrintErrorToFile programmieren...
end select
end sub