Newsgroup: it.comp.lang.perl
Titolo: recovery di un die

Salve a tutti,
non e' molto che programmo in perl , sapreste dirmi come fare il
recovery di un die?
nella fattispecie, parsando un documento XML per estrarne un valore in
base ad una query Xpath , se il documento non e' ben formato il modulo
Xpath mi scatena un die.
Io ho fatto una cosa del tipo:
$SIG{'__DIE__'} = rename($curdirPath . $curfile ,
"$errorDir\/$curfile") ? goto START : die "ERROR" ;
eval { $xpath = XML::XPath->new(filename => $curdirPath . $curfile);
};
ma mi trappa pure, inspiegabilmente ai miei occhi , gli xml che invece
mandano a buon fine la creazione dell'oggetto $xpath . Possibile?
eppure l'handler __DIE__ dovrebbe eseguire la routine assegnata solo
se un evento die fosse sollevato dalla espressione in 'eval' ....
Grazie mille per i consigli , i suggerimenti e gli insulti!!!
il Triste				
-- 
"In absolutely nothing we
                    [trust"
           Megadeth

manca sub{}
$SIG{'__DIE__'} = sub {.....}
-- 
Valter Mazzola -  Software/Databases for Enterprise Web Internet Sites
PHP, Java Servlets, Applets, Jsp, ASP, PERL, Mod_Perl, Apache, IIS,SQL
* 
HTTP://SITIDINAMICI.COM/?nttp
 ----- 
http://italia.LinSwap.com/?nttp
 
Phone:(+39) 347/129-07-16.  Fax:(+39) 02/700-539-403

Il problema e' che se inserisco gli statements dentro una sub , non mi
riesce di fargli prendere la label START ... il fatto e' che l'handler
__DIE__  non interrompe il die , a meno che nelle istruzioni relative
all'handler non ci sia un die , un exit o un goto ....
ora, il die e l'exit non vanno bene xche' mi fanno terminare cmq lo
script. il goto non funzia xche' a quanto pare non posso inserirlo
nelle subroutine. Quindi, come posso uscire dalla routine (il return
non va bene, perche' fa terminare il segnale di die originario) ???
Come posso fare??
Grazie mille!
il Triste

-- 
"Aio' nonno! Se non stai fermo ti spezzo
 le braccine e ti ci prendo a schiaffi!"

 eval { $xpath = XML::XPath->new(filename => $curdirPath . $curfile); };
perché?
se devi trapparlo col die fai:
$xpath = XML::XPath->new(filename => $curdirPath . $curfile) or die;
Guarda, io ho fatto questo:
$curdirPath="c:\\windows\\desktop\\";
$curfile="
fil.pl
";
$errorDir="c:\\windows\\desktop\\errori";
$SIG{'__DIE__'} = rename($curdirPath . $curfile , "$errorDir/$curfile")
? goto START : die "ERROR" ;
$xpath = XML::XPath->new(filename => $nessuno) or die;
START: print "inizio";
Ora, sul desktop ho:
1) il file "
fil.pl
"
2) la cartella "errori"
alla prima esecuzione, 
1) c'è il die su $xpath
2) la trap esegue il rename (sposta il file in "errori")
3) stampa "inizio"
alla seconda esecuzione dello script (
fil.pl
 ora NON è + sul
deskotp ma nella cartella errori)
1) c'è il die su $xpath
2) la trap fallisce il rename
3) lo script stampa ERROR ...
Così dovrebbe funzionare, ma forse non ho capito male io cosa 
serve a te.
-- 
$_=q,6;-16;-1;-8;0;7;-13;-12;-9;-3;13#4A75737420616E6F74686572,,($_,$b)=
split?#?;@b=split?;?;map{$c.=$_,$d.=chr$b[$e++]+ord}split??,pack'H24',$b
;chop$d,print$c.chr(32).$d

 ha lungamente riflettuto e infine scritto:

-- 


 sollevare un die. 
sicuro????
non basterebbe un 
$xpath = XML::XPath->new(filename => $curdirPath . $curfile) or
&sposta_file($curfile);
??
Potresti usare:
##############
$SIG{'__DIE__'} = sub { 
			#faccio operazioni... ma come? dopotutto č un die!
			goto &start 
		       } ;
&start;
sub start { 
	# eventuale ciclo
	$xpath = XML::XPath->new(filename => "$curdirPath\\$curfile");
#eventuale die
}
#############
Facci sapere.




-- 


Dove sarebbe il problema?
Il mio problema e' nel fatto che non riesco a impedire che un die ,
conseguente ad una eccezione , termini il mio script. In realtà
maniere per trappare l'evento ce ne sono (tipicamente l'hook __DIE__ e
l'eval), ma non riesco a far continuare lo script nel processing della
coda di documenti , puoi leggere i precedenti post per una descrizione
piu' dettagliata della situazione...
grazie e un saluto.
il Triste


 coda di documenti 
Ciao, qual'è il problema nell'usare:
##############
$SIG{'__DIE__'} = sub { 
                        #faccio operazioni... ma come? dopotutto è un
die!
                        goto &start 
                       } ;
&start;
sub start { 
        # eventuale ciclo
        $xpath = XML::XPath->new(filename => "$curdirPath\\$curfile");
#eventuale die
}
#############
?
forse che non posso "passare parametri" alla sub che trappa il die?


 Non usare un die... guarda la prima linea del quote.
gliel'ho già proposto in un vecchio post di questo thread:
$xpath = XML::XPath->new(filename => $curdirPath . $curfile) or
&sposta_file($curfile);
ma evidentemente è il modulo che provoca un die al suo interno!



infatti...ragazzi grazie per i consigli, ma temo che non ci sia via
d'uscita: devo cmq in qualche maniera terminare il mio script (con un
die , oppure un exit) e questo e' proprio cio' che mi interessava
evitare.
In particolare , la soluzione proposta dall'ottimo Andrea non si
adattava dato che c'era sempre il problema di passare dall'interno di
una sub ad una label nel main thread...
La fregatura finale e' che ho appurato che l'errore (e conseguente
die) non e' generato dal modulo che richiamo , ma da una libreria c
d'appoggio che effettua il parsing... e il fatal che essa genera non
si hooka in nessuna maniera... :(  
Grazie ancora cmq a tutti per l'interesse e i suggerimenti , siete cmq
stati preziosi!
