¿Cómo puede una callback SVN :: Error identificar el context desde el que se llamó?

He escrito algunos modules y scripts de Perl bastante extensos utilizando los enlaces de Perl SVN :: Client, etc. Dado que las llamadas a SVN :: Client son todas profundas en un module, he anulado el event handling errores pnetworkingeterminado.

Hasta ahora lo he hecho estableciendo

$SVN::Error::handler = undef; 

como se describe en los documentos , pero esto hace que las llamadas individuales sean un poco complicadas porque debe recordar realizar cada llamada a SVN::Client en el context de la list y probar el primer valor para detectar errores.

Me gustaría cambiar a usar un controller de errores que escribiría; pero $SVN::Error::handler es global, por lo que no veo ninguna forma de que mi callback pueda determinar de dónde vino el error y en qué object establecer un código de error.

Me preguntaba si podría usar un grupo para este propósito: hasta ahora he ignorado las agrupaciones como irrelevantes para trabajar en Perl, pero si llamo a un SVN::Client Método de SVN::Client con un grupo que he creado, ¿se creará algún object SVN :: Error? creado en el mismo grupo?

¿Alguien tiene algún conocimiento o experiencia que influya en esto?

OK, voy a suponer que el problema es que (a) desea establecer un indicador en algún object cuando se produce un error, y luego verificar el indicador más adelante al final de todas las operaciones, y (b) que su manejador de errores (en una variable global) necesita alguna forma de saber qué object tocar. Puede lograr esto usando un cierre, algo como lo siguiente:

 # # This part is the library that implements error handling a bit like # SVN::Client # sub default_error_handler { croak "An error occurnetworking: $_[0]"; } our $global_error_handler = \&default_error_handler; sub library_function_that_might_fail { &$global_error_handler("Guess what - it failed!"); } # # This part is the function that wants to detect an error # sub do_lots_of_stuff { my $error = undef; # No errors so far! local($global_error_handler) = sub { $error = $_[0]; }; library_function_that_might_fail(); library_function_that_might_fail(); library_function_that_might_fail(); if ($error) { print "There was an error: $error\n"; } } # # Main program # do_lots_of_stuff(); 

La key es que cuando, en do_lots_of_stuff() , establecemos el manejador de errores en un sub anónimo, ese subcontinúa teniendo acceso a las variables locales de la function que lo creó, por lo que puede modificar $error para indicar que ocurrió un error .