2012-07-04 15 views
6

Soy consciente del hecho de que [email protected] es una variable global, todavía no puedo entender por qué necesito localizarlo antes de usar eval:

Por ejemplo:

eval { SOME_FUNC_THAT_MAY_DIE(); }; 
if ([email protected]) { 
    print "An error occured!\n"; 
} 

La única posible Lo que se me ocurre es que si algún manejador de señales llama al die al mismo tiempo que intento leer [email protected], ¿qué es lo que me falta aquí?

Respuesta

12

La razón para decir local [email protected] antes de llamar eval es evitar pisar a su interlocutor de [email protected]. Es grosero para una subrutina alterar cualquier variable global (a menos que sea uno de los propósitos declarados de la subrutina). Esto no es realmente un problema con el código de nivel superior (no dentro de una subrutina).

Además, en los más antiguos de Perl, cualquier eval llamada durante la destrucción de objetos habría clobber lo global [email protected] (si el objeto estaba siendo destruido debido a una excepción estaba siendo arrojado desde un bloque de eval) a menos [email protected] fue localizado por primera vez. Esto fue fixed in 5.14.0, pero muchas personas aún ejecutan Perls más antiguas.

9

La documentación del módulo Try::Tiny da la razón (así como proporcionar una alternativa):

Cuando se ejecuta un bloque eval y tiene éxito, $ @ se borrará, potencialmente clobbering un error que se recibe actualmente atrapado Esto provoca una acción a distancia, borrando los errores previos que su interlocutor aún no haya manejado. $ @ debe estar correctamente localizado antes de invocar eval para evitar este problema. Más específicamente, $ @ se destruye al principio de la evaluación, lo que también hace que sea imposible capturar el error anterior antes de morir (por ejemplo, al hacer objetos de excepción con pilas de errores).
+0

La razón por la que encontré esta publicación fue exactamente porque no entendí exactamente este párrafo en la documentación de Try :: Tiny. ¿Qué significa 'potencialmente dañar un error que está siendo capturado '? ;-) –

Cuestiones relacionadas