Hi,
ich wollte mal grundsätzlich Fragen wie ihr das mit dem Errorhandling im Zusammenhang mit euren eigenen UDF macht.
z.B. wenn ich mehrere UDF's verwende und viele verschachtelte Funktionen benutzte wird es etwas unübersichtlich die eigentliche Error-Nachricht bis ins Hauptskript zu transportieren.
Ich mache das derzeit ca. so:
Hauptscript:
Spoiler anzeigen
#include <Array.au3>
#include <File.au3>
#include <Nuts_custom1.au3>
[/autoit] [autoit][/autoit] [autoit]Global $logfile=@ScriptDir &"\test.log"
Global $writelog=Int(Iniread("test.ini", "Settings", "writelog", 1))
Global $i_modus=Int(Iniread("test.ini", "Settings", "modus", 1))
Global $h_file=FileOpen("testfile.txt")
Global $s_Filereadline=FileReadLine($h_file, 1)
FileClose($h_file)
_Errorhandling($i_modus)
[/autoit] [autoit][/autoit] [autoit]Exit
[/autoit] [autoit][/autoit] [autoit]Func _Errorhandling($i_flag) ; Funktion im Hauptskript
[/autoit] [autoit][/autoit] [autoit]local $error
[/autoit] [autoit][/autoit] [autoit]switch $i_flag
case 1
$error=_Action_Y($s_Filereadline)
if @error and $writelog then _FileWriteLog($logfile, $error) ; hier soll jetzt die Fehlermeldung aus den Funktionen landen z.B. "TCP Connect fehlgeschlagen" oder "IP nicht gefunden"
case 2
$error=_Action_Z($s_Filereadline)
if @error and $writelog then _FileWriteLog($logfile, $error)
case else
if $writelog then _FileWriteLog($logfile, "ungültiger Modus")
endswitch
endfunc
[/autoit]includes:
Spoiler anzeigen
#include <Nuts_custom2.au3>
Func _Action_Y($s_data) ; <Nuts_custom1.au3>
[/autoit] [autoit][/autoit] [autoit]Local $IP, $socket, $error
[/autoit] [autoit][/autoit] [autoit]if StringInStr($s_data, "192.168.1.1") then
$IP=Stringright($s_data, 11)
$error=_Sende_TCPBefehl($IP)
if @error then Return SetError(1, 0, $error)
else
Return SetError(1, 0, "IP nicht gefunden")
endif
endfunc
[/autoit] [autoit][/autoit] [autoit]Func _Action_Z($s_data) ; <Nuts_custom1.au3>
[/autoit] [autoit][/autoit] [autoit]Local $IP, $socket, $error
[/autoit] [autoit][/autoit] [autoit]if StringInStr($s_data, "192.168.1.1") then
$IP=Stringleft($s_data,11)
$error=_Sende_TCPBefehl($IP)
if @error then Return SetError(1, 0, $error)
else
Return SetError(1, 0, "IP nicht gefunden")
endif
endfunc
[/autoit]Spoiler anzeigen
Func _Sende_TCPBefehl($s_IP) ; <Nuts_custom2.au3>
local $socket = TCPConnect($s_IP, 23)
if @error then
Return SetError(1, 0, "TCP Connect fehlgeschlagen") ; diese Fehlermeldung soll jetzt in der Funktion "_Errorhandling" im Hauptskript ankommen und in ein logfile geschrieben werden
else
TCPSend($socket, "hallo")
endif
endfunc
D.h. ich schleppe die Fehlermeldung, die später im Log des Hauptskripts landen soll, von der tiefsten Ebene (hier _Sende_TCPBefehl($s_IP) bis hin zur höchsten Ebene (Hauptskript).
Bei diesem Beispiel ist das noch gut zu machen, aber bei größeren Skripten muss man höllisch (in jeder Funktion) aufpassen die Fehlermeldung der tieferen Ebene nicht zu verlieren.
Und wenn das passiert ist geht die Fehlersuche los, wo die Nachricht verloren gegangen ist.
Das Logfile von der obersten Ebene (Hauptskript) an die includes zu übergeben ist auch keine Lösung.
Vielleicht habt ihr eine einfachere und bessere Lösung?
Ich würde gerne die Fehlermeldung von jeder Ebene direkt ins Hauptskript bringen und innerhalb der UDF's nur @error Codes verwenden.
Vergleichbar mit dem Errorhandler für COM
ObjEvent("AutoIt.Error", "_ErrFunc")
[/autoit]Würde mich über Vorschläge freuen.
Gruß nuts