Napisałem perl XS wrapper dla biblioteki C składającej się z około ~ 80 funkcji. Obecnie moja ogólna strategia polega na zastąpieniu błędu funkcją C za pomocą PL_sv_undef
, a wywołujący kod Perla musi jawnie sprawdzić, czy zwrot nie jest undef
. (W przypadku niektórych funkcji C jest bardziej skomplikowana jak przekonwertować swoje wyjście do HV
/AV
i wykorzystać pustą listę, aby zgłosić błąd.)W jaki sposób XSUB Perla może umrzeć?
Teraz jak przeprowadziłem się do pisania większych skryptów Perl przy użyciu tej biblioteki, chcę uprość obsługę błędów i użyj np zwykle podobny do wyjątku mechanizm do obsługi błędów.
Obecnie prosty XSUB w moich XS wyglądać tak:
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
Widziałem, że niektóre moduły mają globalną flagę jak „raiseError” do die
na błędów, ale nie udało się znaleźć żadnego przykładu mogę pożyczyć od. Kilka modułów, które mam , odszukało flagę "RaiseError" wewnątrz .pm
, a nie wewnątrz .xs
i tym samym pozwalało używać Perla na die
. W moim przypadku raczej trudno jest implementować wewnątrz .pm
, ponieważ wiele funkcji wymaga specjalnych testów błędów. To również doprowadziłoby do powielenia kodu, ponieważ kontrole są już obecne w XS.
Nie znalazłem nic istotnego w dokumentacji perlxs
/perlguts
. W szczególności widziałem połączenia z Perl_croak()
w .c
wygenerowane z mojego .xs
, ale nie udało się zlokalizować żadnej dokumentacji dla funkcji.
Co to jest XS 'analog z Perla die
? Lub w jaki inny sposób może XSUB raportować do Perl , że funkcja nie działa i nie ma RETVAL do zwrotu? Jak prawidłowo ustawić [email protected]
?
Tylko jedno pytanie. Dlaczego * umiera *, a nie * umiera *? A może to był inny dowcip Larry'ego? – Dummy00001
Nie, [Zefram] (http://search.cpan.org/~zefram). Jest to [hackish] (http://catb.org/jargon/html/writing-style.html) użycie, ponieważ pochodzi od słowa kluczowego 'die'. – daxim