open ConfigFileObject, "< ".read_data("FILES", "CONFIGFILE") || write_errorlog("ERROR: $! : ".read_data("FILES", "CONFIGFILE"),"3");
$RECIEVED=get("http://192.168.0.2/cgi-bin/rs485_getdata.pl?get=B16");
2020-03-13T10:06:25 OliverWas aber, wenn irgendwo in einem eher unkritischen Bereich ein Fehler auftritt? Ich kann ja nicht in jeder CodeZeile ein Handling machen...
Manchmal kommt es vor, dass zum Beispiel die Antwort des Servers falsch, unvollständig ist oder gar keine kommt
$RECIEVED=get("http://192.168.0.2/cgi-bin/rs485_getdata.pl?get=B16");
2020-03-13T11:59:51 OliverDaher möchte ich, dass bei allen nicht behandelten Fehlern (oder alternativ bei allen) die Fehlerausgabe NICHT nach STDERR, sondern eben in eine Fehlerbehandlungsroutine umgeleitet wird.
2020-03-13T20:07:16 OliverIch könnte noch nicht genauer hinsehen, aber ich verstehe euch so, dass Capture::Tiny die Ausgaben an StdERR abfängt und irgendwohin (in eine Subroutine) umleiten kann. Das wäre genau das, was ich suche.....
QuoteIn dem betreffenden Programm habe ich zwar ein Fehlerhandling implementiert, aber es kann ja dennoch auch zu unerwarteten / unberücksichtigten Fehlern kommen. Diese würde ich gerne "global" abfangen.
open ConfigFileObject, "< ".read_data("FILES", "CONFIGFILE") || write_errorlog("ERROR: $! : ".read_data("FILES", "CONFIGFILE"),"3");
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;
}
}
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;
}
}
QuoteUse of uninitialized value in concatenation (.) or string at ./clients_getdata.pl line 1899, <ReadCommandFileObject> line 1.
QuoteUse 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.
2020-03-15T09:51:20 OliverDen (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.
2020-03-15T17:20:41 Olivernoch ist dies ein öffentlich zugänglicher Server. Es gibt exakt 3 Leute, die Zugriff haben. ... sie erhalten NUR einen Intetnetzugang über ein VLAN. ...
Hier sei jetzt auch gesagt, dass dieses Script im eigentlichen Sinne NICHT zum Webserver gehört und mehr als Dienst im Hintergrund auf dem Server läuft. Es sammelt Daten, kommuniziert mit vielen (kleinen) Aktoren/Sensoren und verschickt Befehle an eben diese.
perl -e 'use Tie::STDERR \&test; sub test {print "ERROR " . time() . " @_"}; print STDERR "hello world!";'
1 2 3 4 5 6
print eval{ # hier steht Code der schiefgehen kann die("Werfe eine Exception, leider gabs Problem"); "Alles gutgegangen!"; } || "Fehler: $@";