Thread Errorhandling (26 answers)
Opened by Oliver at 2020-03-13 10:10

Oliver
 2020-03-15 10:51
#191544 #191544
User since
2020-03-13
9 Artikel
BenutzerIn
[default_avatar]
Den (Perl-code) kann ich dir gerne zeigen. ALLERDINGS! Man muss eher das Gesamtsystem betrachten, da an vielen unterschiedlichen Stellen Fehlerbehandlung gemacht wird. ZB wird auf den Webseiten kontrolliert, ob die Angaben sinnvoll und richtig sind. Wird zB eine Uhrzeit eingegeben, dann wird schon VOR dem Senden überprüft, ob diese 5 stellig ist, das 3. Zeichen ein ':' ist, die zwei Zahlen davor im Bereich 01-23 und die zwei Zahlen dahinter im Bereich 00-59 sind.

In dem Perl-Code wird dann auf zB so auf Dateifehler reagiert:
Code: (dl )
  open ConfigFileObject, "< ".read_data("FILES", "CONFIGFILE") || write_errorlog("ERROR: $! : ".read_data("FILES", "CONFIGFILE"),"3");


oder beim Lesen der Daten aus der "Datenbank" wird überprüft, ob die verlangte Variable überhaupt existiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub read_data{
my ($Section, $Parameter) = @_;
if (exists $Data{$Section}{$Parameter}) {
return $Data{$Section}{$Parameter};
} else {
write_errorlog("ERROR by reading Data : $Section - $Parameter -> Not found!","2");
return undef;
}
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub write_errorlog {
my ($Logstring, $CriticalState) = @_;
debug($Logstring);
if (read_data("FILES", "ERRORLOG") eq "YES") {
open (ErrorFileObject, ">>".read_data("FILES", "ERRORLOGFILEPATH").$DateForFiles."_ERROR.log") || write_errorlog("ERROR: $! : ".read_data("FILES", "CONFIGFILE"),"3");
print ErrorFileObject "$DateForHuman $TimeForHuman : $Logstring\n" ;
close (ErrorFileObject);
}
if ($CriticalState eq "2") {
telegrammessage($Logstring);
} elsif ($CriticalState eq "3") {
telegrammessage($Logstring);
telegrammessage("Prozess muss beendet werden!");
die;
}
}


In dem Perl-Code ist es wohl strenggenommen eher kein FehlerHANDLING, sondern eher eine FehlerNOTIFICATION. Die Fehler, die hier auftreten, sind nicht zu händeln, sondern müssen im Code (oder woanders) korrigiert werde.

Es kann auch passieren das (WLAN) Netzwerkverbindungen abbrechen oder (längere Zeit) nicht zu stande kommen. Auch das wird protokolliert. Hier kann der Code noch so gut sein, das kann kein PERL der Welt beheben...

Natürlich teste ich Code (-Blöcke) bevor ich sie aktive/produktiv einsetze. Aber, was als Teilstück funktioniert, muss ja nicht unbedingt im Ganzen gehen.

Sowas zB trat schon öfter auf (konnte es immer beheben ;-)), ist aber in der Zuordnung WO und WANN es passiert schwer zu finden. Zwar wird die Code-Zeile angegeben, aber nicht das, was vorher passiert ist / gemacht wurde.

Quote
Use of uninitialized value in concatenation (.) or string at ./clients_getdata.pl line 1899, <ReadCommandFileObject> line 1.


Quote
Use of uninitialized value in list assignment at ./clients_getdata.pl line 1941.
Odd number of elements in hash assignment at ./clients_getdata.pl line 1941.


Daher würde ich mir wünschen, dass diese auf STDERR ausgegebenen Fehler in meinen LOG stehen. Dann kann ich sagen, was das Programm gemacht hat kurz vorher

So, Du wolltest den Code sehen Was denn genau? :-)
Die ersten 1500 Zeilen sind "nur" Datenspeicher....
Anhänge
text/plain
2395 lines
code.pl

View full thread Errorhandling