Fehlermeldungen unterdrücken allgemein

  • Hallo zusammen.

    Ich nutze diverse kleinere als exe Dateien kompilierte Autoit Skripte für Automatisierungen, z.B. um Dateien wie Word Vorlagen von einem Server ins Nutzerverzeichnis zu kopieren, um lokale User anzulegen, Verknüpfungen auf dem Desktop zu erstellen usw.... Die Dateien werden meist per Autostart beim Rechnerstart oder per Gruppenrichtlinie verteilt und automatisch im Hintergrund ausgeführt.

    Das funktioniert in 99 von 100 Fällen auch tadellos. Aber ab und zu kommt es vor, dass eine Exe ewig im Taskmanager zu sehen ist, woraus ich mutmaße, dass sie irgendeine Fehlermeldung bringt, die man normalerweise wegklicken muss, bevor das Programm beendet wird. Aber da die Exe automatisch im Hintergrund ausgeeführt wird, wir die Meldung nicht angezeigt, kann vom User auch nicht weggeklickt geschweigedenn gelesen und analysiert werden.

    Ist es irgendwie möglich, generell bei allen kleineren Skripten etwas einzubauen, dass Fehlermeldungen unterdrückt und das Programm stattdessen sofort beendet wird? Oder dass sämtliche angezeigte Fehlermeldungen nach einem kurzen Timeout verschwinden und das Programm dann geschlossen wird?

    Danke für eure Tipps.

  • Hi,

    dieses "Problem" der fehlenden "on error (goto)"-Funktion ist einer der großen "Krankheiten" von AutoIt!

    Wenn der "Fehler" von einer COM-Funktion kommt, kannst du diesen im COM-error handler abfangen....cool, oder?

    Bei schickimickistateoftheart-COM ist das errorhandling bei sog "Fehlern" möglich und auch gewollt (sic) und da wird auch seitens Entwicklern bis zum Erbrechen drauf hingewiesen, aber bei "Standard"-Fehlern bei 0815-Funktionen ist das so etwas von uncool, unnötig und gefälligst vom Programmierer mit unendlich langem Code (Abfrage ALLER möglichen Fehler per @error-code) abzufangen....wie ich schon sagte...KRANK!! :Face:

    Warum bei einem BASIC-Interpreter von 1981 ein "on error" funktioniert ( und übrigens bei etlichen anderen bis heute gebräuchlichen und weit verbreiteten Programmiersprachen auch), aber bei einem "modernen" BASIC-Interpreter wie AutoIt nicht, musst du die Entwickler fragen....lass es, ich habe es gemacht... ;(


    Dir bleibt also nichts weiter übrig, als ALLE möglichen (!) Fehler per @error abzufangen und darauf zu reagieren, oder (wenn du COM verwendest), einen com-error-handler zu programmieren. :rtfm:

  • Was Andy da geschrieben hat - trifft zu.... leider.

    Ich hätte ev. noch einen pragmatischen Lösungsansatz.

    Lass Dein Programm als allererstes irgendwo eine fehler.txt Datei schreiben (anlegen) und bei Programmende wieder löschen. Nun legst Du Dir ein zweites Progrämmchen (dass Du Dir erst schreiben musst) in den Autostart oder läßt es von Programm 1 aus, aufrufen. Dieses Hilsprogramm überprüft ununterbrochen (mit sleep) ob Deine Fehler Datei noch da ist - wenn nicht ---> Hilsprogramm beenden. Wenn nach einer Zeitspanne Deiner Wahl die Fehler.txt noch immer da ist ... liegt der Befund eines "Hängers von Programm 1" nahe... nun "schießt" Dein Hilsprogramm den Hänger ab, löscht die Hilfe Datei und beendet sich selbst....


    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo und danke für eure Antworten, wenn sie auch etwas ernüchternd sind :)

    Da ich auf Anhieb nichts anfangen kann mit

    wenn du COM verwendest

    gehe ich mal davon aus dass ich keine verwende :)

    Das mit dem Hilfsprogramm ist ein guter Tipp, danke dafür! Aber was, wenn das Hilfsprogramm dann ebenfalls an einer Stelle eine Fehlermeldung bringt und seinerseits in Endlosschleife hängt? Hilfsprogramm fürs Hilfsprogramm? :D Spaß bei Seite, das werde ich mir in der Tat mal anschauen, ob man einfach einen Dreizeiler baut. Dazu muss das eigentliche Programm ja nichtmal angepasst werden und eine Fehler.txt schreiben - es reicht ja, wenn das Hilfsprogramm das eigentliche Programm nach XX Sekunden abschießt, wenn das dann noch laufen sollte.

    Danke euch.

  • Ja entweder so oder eben als allererste Zeile ein File write

    und als letzte Zeile ein File delete schon hast Du es.. die Anpassung fällt also minimalistisch aus, und verändert dienen Code im Kern nicht.


    LG

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ja entweder so oder eben als allererste Zeile ein File write

    und als letzte Zeile ein File delete schon hast Du es.. die Anpassung fällt also minimalistisch aus, und verändert dienen Code im Kern nicht.


    LG

    Peter

    Aber man muss die exe neu kompilieren und überall ersetzen ;)

  • Es gibt eine Lösung :)

    Ich hatte vor ewigen Zeiten das selbe Problem (MsgBox wartet im Hintergrund auf ein "OK") und Trancexx hatte die Lösung.
    Guckst Du hier: https://www.autoitscript.com/forum/topic/14…from-a-service/

  • Ich würde sagen: Wissen ist macht ;) .

    Also füg am besten logging zu deinem Programm hinzu, sodass du herausfinden kannst, wo genau das Programm hängen bleibt, sodass du das beheben kannst.

    Ein "Hilfsprogramm" zum beenden ist keine wirklich gute Lösung, sondern nur ein (meiner Meinung nach schlechter) Workaround, weil das eigentliche Problem komplett ignoriert wird.

    Und ja, Fehlersuche+Behebung kann nervig sein, dafür wird man mit einem gut laufenden Programm belohnt :)

  • Also füg am besten logging zu deinem Programm hinzu, sodass du herausfinden kannst, wo genau das Programm hängen bleibt, sodass du das beheben kannst.

    Sehe ich auch so.

    AutoIt liefert bereits eine einfache Log-Funktion, siehe _FileWriteLog

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Bei mir trat der Fehler in einem mehr als umfangreichen Programm - das auf einem Server lief und von einem IT-Managementsystem getriggert wurde - nur alle paar Wochen auf.

    Mit der Function von trancexx gelang es mir ohne viel Aufwand den Ort des Fehlers und die Situation (war abhängig von den Eingangsdaten) zu protokollieren und dann den Code entsprechend anzupassen.

    BTW: Eine umfangreiche Loggingfunction war bereits eingebaut, half aber im konkreten Fall nicht.

  • water

    Du schreibst:

    Ich hatte vor ewigen Zeiten das selbe Problem (MsgBox wartet im Hintergrund auf ein "OK")

    Ich habe dieses Problem der Msgbox im Hintergrund auch ab und an, aber nur bei Testläufen während der Erstellungsfase.

    Frage mich aber immer wieder wie das passieren kann, bzw. was man dagegen tun kann. Vermisse ich da ein Feature z.B. Msgbox immer im Vordergrund?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Eine Vorgehensweise würde ich noch anmerken wollen:

    Du schreibst, das compilierte Script wird per Gruppenrichtlinie verteilt und beim Rechnerstart ausgeführt. Damit auch mit Admin- oder besser System-Recht, bzw. -Umgebung. Also werden MsgBox'en sowieso nicht auf dem User-Desktop angezeigt, welcher auch beim Rehnerstart noch gar nicht vorhanden ist, also auch dort nicht dargestellt werden könnte.

    Ich empfehle in einem derartigen Fall, auf alle MsgBox-Zeilen im Script zu verzichten. Lassen sich ja schnell auskommentieren oder ausschließlich abhängig von einem Debug-Flag bei Script-Start einzublenden.

    Ähnlich verfahre ich bei Scripten, welche als Dienst laufen sollen. Benötige ich Meldungen, lege ich ein Logfile an, welches auch benutzerübergreifend funktioniert.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hallo zusammen und nochmal vielen Dank für die zahlreichen Rückmeldungen Meinungen Ideen Lösungsansätze und Hinweise!!!! TOP!! :klatschen:

    Es gibt eine Lösung :)

    Ich hatte vor ewigen Zeiten das selbe Problem (MsgBox wartet im Hintergrund auf ein "OK") und Trancexx hatte die Lösung.
    Guckst Du hier: https://www.autoitscript.com/forum/topic/14…from-a-service/

    Spannend. Ich verstehe zwar nicht jede Zeile in diesem Code, interpretiere das aber so, dass ich das ganze Konstrukt einfach vor meinen eigentlichen Quellcode setzen müsste und das kümmert sich dann darum, dass irgendwelche Fenster mit dem Titel "AutoIt Error" abgefangen werden?

    Ich würde sagen: Wissen ist macht ;) .

    Also füg am besten logging zu deinem Programm hinzu, sodass du herausfinden kannst, wo genau das Programm hängen bleibt, sodass du das beheben kannst.

    Ein "Hilfsprogramm" zum beenden ist keine wirklich gute Lösung, sondern nur ein (meiner Meinung nach schlechter) Workaround, weil das eigentliche Problem komplett ignoriert wird.

    Und ja, Fehlersuche+Behebung kann nervig sein, dafür wird man mit einem gut laufenden Programm belohnt :)

    Sehe ich auch so.

    AutoIt liefert bereits eine einfache Log-Funktion, siehe _FileWriteLog

    Ihr habt beide Recht und eigentlich logge ich mit _FileWriteLog auch so ziemlich alles, was ich in den Skripten so tue, denn ich lege imme großen Wert auf umfangreiche, gut strukturierte Logfiles. Also ich schreibe eigentlich alle Return-Werte und Error Codes in die Logfiles zurück, aber sicherlich auch nicht alles... Darum handelte sich ja meine Ausgangsfrage, ob es möglich ist, pauschal Fehlermeldungen abzufangen (oder zu loggen)...

    das compilierte Script wird per Gruppenrichtlinie verteilt und beim Rechnerstart ausgeführt. Damit auch mit Admin- oder besser System-Recht, bzw. -Umgebung. Also werden MsgBox'en sowieso nicht auf dem User-Desktop angezeigt, welcher auch beim Rehnerstart noch gar nicht vorhanden ist, also auch dort nicht dargestellt werden könnte.

    Ich empfehle in einem derartigen Fall, auf alle MsgBox-Zeilen im Script zu verzichten. Lassen sich ja schnell auskommentieren oder ausschließlich abhängig von einem Debug-Flag bei Script-Start einzublenden.

    Auf MsgBoxes verzichte ich eigentlich immer und schreibe stattdessen in ein Log, wenn ich solche "Automatisierungstools" baue, denn die laufen ja als Local System und sind für den angemeldeten User unsichtbar.

  • Ich empfehle in einem derartigen Fall, auf alle MsgBox-Zeilen im Script zu verzichten.

    Bei mir ging es nicht um MsgBox-en aus dem Skript selbst sondern um Meldungen von AutoIt.

    Für diese Laufzeitfehler ist die Lösung von Trancexx gedacht.

  • War "mir" klar. Wusste aber zu dem Zeitpunkt nicht 100%ig, ob Schokolade MsgBox'en aus seinen Scripten bereits verbannt hatte. Ging aus dem Start-Beitrag nicht genau hervor.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ist mir auch schon passiert, dass sich eine zur Fehlersuche eingebauten MsgBox oder ein _ArrayDisplay im Sktript bzw. einem der eigenen UDF's versteckte :)

  • Kann man diese automatischen MsgBoxen nicht irgendwie mit einem Timer versehen? Vielleicht ist das mal ein Vorschlag an die Entwickler?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Warum sollte man? Das sind Fehlermeldungen die Du auf jeden Fall mitkriegen solltest!
    Ich finde die Lösung von trancexx genial, da sie die Meldung abfängt und Dir die Möglichlkeit gibt beliebige Debugginginformationen z.B. in einen Log zu schreiben. Danach wird die MsgBox bestätigt.
    Auf dieser Basis kannst Du dann den Fehler bereinigen.

  • Naja, nicht für jeden Fehler ist Autoit verantwortlich.

    Als Beispiel:

    Für Daten die ich in meinen Programmen verwende kommen häufig als Quelle *.csv Dateien zum Einsatz. Nun legt ein Mitareiter einen neuen, weiteren Datensatz an, und vergisst bzw. macht ein ; zuviel. Das überlebt im Zweifel das Programm nicht.

    Natürlich kann man das auch überprüfen und versuchen den Fehler abzufangen.

    Da man aber beim Programmkozept nicht an alles Denken kann, und unverhofft bekanntlich oft kommt habe ich mir etwas pragmatisches einfallen lassen.

    In meinen Verzeichnissen für meine selbstgeschriebenen Programme gibt es grundsätzlich ein TEMP Verzeichnis, In diesem erstelle ich bei Programmstart eine fehler.txt Datei. Diese wird, zusammen mit dem restlichen Inhalt des Temp Verzeichnises bei beendigung meines Progrämmchens gelöscht .

    Bevor ich aber am Programm Anfang die Datei erstelle sehe ich nach ob sie noch da ist, denn wenn Sie nicht gelöscht wurde hat sich mein Programm aufgehängt. Wenn das so ist, lasse ich mir eine Mail schreiben so dass ich das Problem suchen kann...

    Mag ein wenig altmodisch klingen funktioniert aber bei den vielen Programmen, die bei mir meist nach Feierabend Ihren Dienst tun, wunderbar. Auf eine Kontrolle ob die Software Ihren Dienst gemacht hat kann so verzichtet werden.

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo zusammen,

    klar baut man mal MsgBoxes für Testzwecke ein, aber ich habe mir angewöhnt, die immer sofort wieder auszukommentieren oder zu löschen wenn sie ihren Zweck erfüllt haben. Habe in dem Skript, welches aktuell die sporadischen Hänger hat, auch nochmal geschaut - alle auskommentiert. Es müssen also wirklich irgendwelche Auotit Meldungen sein, vielleicht irgendwo ein Array nicht sauber definiert oder sowas... Ich baue jetzt mal den Code von Trancexx ein und werde es weiter beobachten.

    Schöne Woche.