Pergunta

Eu escrevi um invólucro Perl XS para uma biblioteca C composta por ~ 80 funções. No momento, minha estratégia geral é substituir o erro de uma função C com PL_sv_undef e o código Perl de chamada deve verificar explicitamente se o retorno não é undef. (Para algumas funções C, é mais complicado à medida que eu converso sua saída em um HV/AV e use a lista vazia para relatar o erro.)

Agora, quando me mudei para escrever scripts perl maiores usando essa biblioteca, quero simplificar o manuseio de erros e usar o habitual eval {}/die Mecanismo de exceção para lidar com erros.

No momento, um xsub simples nos meus Xs se parece com isso:

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

Eu vi que alguns módulos têm bandeira global como "RaiseError" para die em erros, mas não encontrou qualquer exemplo de que possa pedir emprestado. Os poucos módulos que encontrei lidam com a bandeira "Raiseerror" dentro do .pm, não dentro do .xs, e, portanto, permitido usar os perl's die. No meu caso, é bastante difícil de implementar dentro do .pm Como muitas funções requerem verificações especiais de erro. Isso também levaria à duplicação do código, pois as verificações já estão presentes dentro do XS.

Não encontrei nada relevante no perlxs/perlguts documentação. Em particular, eu vi ligações para Perl_croak() no .c gerado do meu .xs, mas não conseguiu localizar qualquer documentação para a função.

Qual é o análogo do XS dos Perl's die? Ou de que outra forma o Relatório XSUB ao Perl em tempo de execução de que a função falhou e não há retval para retornar? Como definir corretamente o $@?

Foi útil?

Solução

Perl_croak () está documentado aqui no perlapi página de homem. Como mostra o exemplo nessa página, você pode passar uma sequência de mensagens ou definir manualmente $@ como um objeto de exceção e passar nulo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top