Hallo,
grosse Verzweiflung, ich brauche einen Tipp. Ich validiere in einer Schleife eine Anzahl von XML-Dateien. Dummerweise kackt alles ab, wenn der Parser(Xerces) einen Fehler schmeisst. Statt dessen will ich aber mit dem nächsten File der Schleife weitermachen. Macht er aber nicht ...
37 ############################################################################# 38 sub validate{ 39 ############################################################################# 40 my $self = shift; 41 my $logger = get_logger; 42 43 # Daten aus der Pipe lesen 44 my $file; 45 foreach $file($self->{'connector'}->transport->get_pipe){ 46 # XML-Datei parsen und validieren 47 print STDERR "in File $file\n"; 48 eval { 49 local $SIG{__DIE__} = sub { print STDERR "habe die bekommen\n" }; 50 $self->parser->parse($file); 51 }; 52 if($@){ 53 my $errstr= "Fehler beim Parsen übergebenes XML-Dokument \n ". XML::Xerces::error($@); 54 $logger->fatal($errstr); 55 # schlechte Files aus der Pipe löschen TODO: Fehlerprocessing 56 $self->{'connector'}->transport->deletePipe($file); 57 print STDERR $errstr; 58 }else{ 59 $logger->info("validiere $file ... OK"); 60 } 61 } 62 return 1; 63 }
bringt:
pummel@connector:~/bidi_test> ./connector.pl in File /home/pummel/var/spool_test/xml/pipe/Artikeldaten_CyberParts_20031127100545_00031252.XML in File /home/pummel/var/spool_test/xml/pipe/Artikeldaten_CyberParts_20031127100726_00013280.XML in File /home/pummel/var/spool_test/xml/pipe/Artikeldaten_CyberParts_20031127100513_00031249.XML in File /home/pummel/var/spool_test/xml/pipe/Artikeldaten_CyberParts_20031127100720_00000856.XML habe die bekommen Error in eval: ERROR: FILE: /home/pummel/var/spool_test/xml/pipe/Artikeldaten_CyberParts_20031127100720_00000856.XML LINE: 12 COLUMN: 34 MESSAGE: Datatype error: Type:InvalidDatatypeFacetException, Message:Value '-50.00' must be greater than or equal to MinInclusive '0.01' . at /home/pummel/bidi_test/Connector/XMLHelper.pm line 50 at /home/pummel/bidi_test/Connector/XMLHelper.pm line 53 pummel@connector:~/bidi_test>
alle STDERRS werden prima ausgegeben, dienen aber nur zu Fehlersuche. Der Logger loggt nix mehr ab $@ und deletePipe wird auch nicht ausgeführt. geschweige denn er geht in den nächsten foreach-Lauf rein. Wie aber kommt die() vom Parser aus dem eval{}-Block raus??
Mit freundlichen Grüßen
Jens Puruckherr