2010-09-02 16 views
5

He escrito una envoltura Perl XS para una biblioteca C que consta de aproximadamente ~ 80 funciones. En este momento, mi estrategia general es sustituir el error de una función C con PL_sv_undef y el código Perl llamante debe verificar explícitamente si el resultado no es undef. (Para algunas funciones de C es más complicado como puedo convertir su producción en un HV/AV y utilizo lista vacía para informar del error.)¿Cómo puede morir el XSUB de Perl?

Ahora mientras me movía a escribir más grandes scripts de Perl usando esa biblioteca, quiero simplifica el manejo y uso de errores, por ejemplo el mecanismo eval {}/die de excepción como mecanismo para manejar errores.

En el momento en que un XSUB simple en mis XS ven así:

SV * 
simple_function(param1, param2 = 0, param3 = 0) 
     int    param1 
     int    param2 
     int    param3 
     CODE: 
       int rc; 
       rc = simple_function(param1, param2, param3); 
       RETVAL = (rc == 0) ? &PL_sv_yes : &PL_sv_undef; 
     OUTPUT: 
       RETVAL 

he visto que algunos módulos tienen indicador global como "RaiseError" a die en errores, pero no pudieron encontrar ningún ejemplo que pueda prestar de. Los pocos módulos que tengo encontraron manejar el indicador "RaiseError" dentro de .pm, no dentro de .xs, y permitieron así usar el die de Perl. En mi caso, es bastante difícil de implementar en dentro del .pm, ya que muchas funciones requieren verificaciones de error especiales. Eso también conduciría a la duplicación de código ya que las comprobaciones ya están presentes dentro del XS.

La información de perlxs/perlguts no encontró ninguna traducción pertinente. En particular, he visto llamadas a Perl_croak() en el .c generadas desde mi .xs, pero no he podido encontrar ninguna documentación para la función.

¿Cuál es el análogo XS del Perl's die? ¿O cómo puede el XSUB informar al Perl en tiempo de ejecución que la función ha fallado y que no hay ningún RETAL? Cómo configurar correctamente el [email protected]?

Respuesta

6

Perl_croak() se documenta here en la página de manual perlapi. Como muestra el ejemplo en esa página, puede pasarle una cadena de mensaje, o puede establecer manualmente $ @ en un objeto de excepción y pasar NULL.

+0

Una sola pregunta. ¿Por qué * morir * y no * morir *? ¿O era otro ingenio de Larry? – Dummy00001

+1

No, [Zefram] (http://search.cpan.org/~zefram) 's. Es un uso [hackish] (http://catb.org/jargon/html/writing-style.html) porque se deriva de la palabra clave 'die'. – daxim

Cuestiones relacionadas