2012-05-04 12 views
5

Esta construcción es bastante común en Perl:perl "o" manejo de errores: ¿es posible una declaración múltiple en caso de error?

opendir (B,"/somedir") or die "couldn't open dir!"; 

Pero esto no parece funcionar:

opendir (B, "/does-not-exist ") or { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
}; 

¿Es posible que la "o" de manejo de errores para tener más de un comando?

Compilación de lo anterior:

# perl -c test.pl 
syntax error at test.pl line 5, near "print" 
syntax error at test.pl line 7, near "}" 
test.pl had compilation errors. 
+2

impresiones de error deben ser enviados a 'STDERR', y se debe utilizar' die' en lugar de '' print' + exit'. – ikegami

Respuesta

14

siempre se puede utilizar do:

opendir (B, "/does-not-exist ") or do { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

O puede usar si/no ser que:

unless (opendir (B, "/does-not-exist ")) { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

O puede oscilar juntos su propio subrutina:

opendir (B, "/does-not-exist ") or fugu(); 

sub fugu { 
    print "sorry, that directory doesn't exist.\n"; 
    print "now I eat fugu.\n"; 
    exit 1; 
} 

Hay más de una forma de hacerlo.

+0

El "más regular" no funciona, por ejemplo, si uno usa 'open (my $ B, ...)'. – ikegami

+0

@ikegami Bueno, * no * funciona, simplemente no será muy productivo. Con el manejador de archivo global, no debería importar. – TLP

+0

@TLP aparte del problema de alcance, ¿por qué considera que no se recomienda la solución "a menos"? –

-2

El manejo de excepciones en Perl se realiza con eval()

eval { 
    ... 
} or do { 
    ...Use [email protected] to handle the error... 
}; 
+0

'open' no muere, solo devuelve' undef'. No hay nada que atrapar usando 'eval'. – chepner