BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Library.Modul für Makro-Fehlerausschrift bestimmen

Alles zur Programmierung im LibreOffice.
Antworten
herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Library.Modul für Makro-Fehlerausschrift bestimmen

Beitrag von herz4 » Mo 10. Jul 2017, 13:51

Meine über die Jahre vielfältigen LO-Makros und -Funktionen haben (fast) alle eine Fehlerroutine, die mir Fehlernummer, Fehlertext und auch die Zeilennummer des Scripts ausgibt. Das ist ausreichend bei der eigentlichen Programmierung.

Jedoch treten auch nach längerer Zeit etwa durch geänderte Links oder Updates Fehler auf, die so zwar immer noch angezeigt werden, aber leider nicht das jeweilige Modul oder auch die Library benennen.

Allein mit der Zeilennummer ist die "Stelle" - zuweilen - in den Bibliotheken schwerer zu finden.

Ich fand noch keine Basic-Funktion oder auch API/Schnittstelle, die mir eben neben dem eigentlichen Fehler auch Library und Modul der betroffenen, aktuellen oder auch "arbeitenden" Sub/Function liefert.

(Natürlich funzt eine statische Speicherung von Library.Modul im Makro selbst; diese wäre dann aber bei Umorganisationen bzw. Umbenennungen auch zu aktualisieren ...)

Luxuswunsch, - oder? - von herz4!
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Library.Modul für Makro-Fehlerausschrift bestimmen

Beitrag von gogo » Mo 10. Jul 2017, 22:06

Ich übergebe der (zentralen) Fehlerroutine einen optionalen Parameter, der Bibliothek, Makro und Funktionsname beinhaltet ... anders geht's leider nicht, außer man baut in die zentrale Routine ein Break ein

Code: Alles auswählen

...
print "Abbrechen?"
...
Dann hat man eine gute Chance exakt die Stelle zu finden. Aber nicht immer, denn bei Subs die von anderen Subs aufgerufen werden funktioniert das nicht immer, vor allem dann wenn nicht jede eine Fehlerroutine hat.
Der optionale Parameter kann auch gennutzt werden um eine Fehlerstatistik anzulegen. z.B. in einer Log-Tabelle mit Datum/Uhrzeit, Nutzer, Funktionsname, Fehlertext. Dann weiß man in Mehrbenutzerumgebungen wer welchen Fehler wie oft weggeklickt hat (... und kann, wenn nach Monaten eine Beschwerde kommt à la: "... das hat ja noch nie funktioniert ..." dezent drauf hinweisen, dass im Fehlertext stand: Bitte den Programmierer benachrichtigen!) :)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Library.Modul für Makro-Fehlerausschrift bestimmen

Beitrag von herz4 » Di 11. Jul 2017, 17:27

Danke gogo für Deine schnelle Antwort,

aber eben diese Bezeichner von Bibliothek, Modul und Makro, die Du an die Fehlerroutine übergeben lässt, musst Du "händisch" ins Script schreiben, oder kann Basic/API diese, also die des - beinhaltenden - Makros "ausspucken"? Die - zentrale - Fehlerroutine müsste eigentlich nur ihren Aufrufer outen; im System gespeichert wird dieser Punkt bestimmt, weil hernach geht's ja genau dahin wieder zurück :!:

Dein Tipp mit der Fehlerstatistik ist gut, ich klicke mich ja oft genug auch selber weg, weil's gerade pressiert :twisted:

Mit bestem Gruß, herz4.
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: Library.Modul für Makro-Fehlerausschrift bestimmen

Beitrag von gogo » Di 11. Jul 2017, 21:37

... 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
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

herz4
Beiträge: 52
Registriert: Sa 17. Dez 2016, 16:11

Re: Library.Modul für Makro-Fehlerausschrift bestimmen

Beitrag von herz4 » Mi 12. Jul 2017, 08:40

Danke gogo besonders für Deinen ausführlichen Code. :o Wenn ich auch bei 10.000 Codezeilen oder mehr "angekommen" bin, werde ich mich bestimmt an Deine Anregung Fehlerlog erinnern.

Ich habe eine völlig unausgereifte Idee, wie man noch das Finden der Fehlerstelle beschleunigen könnte - mit etwas Mühe - : jedes Makro oder wenigstens jedes Modul bekommt eine eindeutige ID als Konstante, vielleicht auch mit enthaltenem Fertigstellungsdatum des Makros, nach welcher womöglich per eigenem Makro (oder auch im Errorhandler) in allen Scripten aller Bibos gesucht werden kann. Mit der Zeilennummer aus ERL könnte man dann auch den darüber stehenden Makronamen ermitteln ...

Zugegeben: ich weiß nicht einmal, wie man in LO-Basic auf die Listings der Module und Makros zugreift, ob das überhaupt funzt! Ich meine, es sind letztlich (lesbare) xml-Dateien ...

Is halt so 'ne Idee - von herz4 :lol:
:? 2024-02-26 Linux Mint 20.1 64bit Ulyssa base: Ubuntu 20.04 focal, Cinnamon 4.8.6, Linux-Kernel 5.15.0-97-generic, LO Version: 6.4.7.2 Build-ID: 1:6.4.7-0ubuntu0.20.04.9, HSQL Database Engine 2.5.0 extern mit org.hsqldb.jdbcDriver

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten