Wie kann Perl XSUB sterben?
Frage
Ich habe einen Perl-XS Wrapper für eine C-Bibliothek geschrieben 80, bestehend aus etwa ~
Funktionen. Gerade jetzt meine allgemeine Strategie ist es, die Fehler aus einer C zu ersetzen
Funktion mit PL_sv_undef
und der anrufende Perl-Code haben explizit zu überprüfen
ob die Rückkehr ist nicht undef
. (Bei einigen C-Funktionen ist es komplizierter
wie ich konvertieren ihre Ausgabe in eine HV
/ AV
und verwenden leere Liste den Fehler zu melden.)
Nun, wie ich zu schreiben größeren Perl-Skripte bewegte diese Bibliothek verwenden, mag ich
Vereinfachung der Fehlerbehandlung und Verwendung z.B. der üblichen eval {}
/ die
Ausnahme-like
Mechanismus Griff Fehler.
Im Moment ein einfaches XSUB in meinem XS sieht wie folgt aus:
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
Ich habe gesehen, dass einige Module globale Flags wie „Raiseerror“ zu die
haben auf
Fehler aber nicht jedes Beispiel zu finden, die ich von leihen. Die wenigen Module Ich habe
die „Raiseerror“ Flag innerhalb des .pm
gefunden handhaben, nicht innerhalb des .xs
und
so erlaubt die die
Perl zu verwenden. In meinem Fall, das ist ziemlich schwer zu
Umsetzung innerhalb des .pm
so viele Funktionen spezielle Fehlerprüfungen erfordern. Das
auch Code-Duplizierung führen würde, da die Kontrollen bereits in der XS sind.
habe ich nichts gefunden relevant in der perlxs
/ perlguts
Dokumentation. Insbesondere habe ich Anrufe Perl_croak()
im .c
von meinem .xs
erzeugt gesehen, aber nicht alle Unterlagen für die Funktion zu finden.
Was ist der Analog ‚XS der Perl die
? Oder wie sonst kann die XSUB Bericht zu Perl
Laufzeit, dass die Funktion ausgefallen ist und es gibt keine RETVAL zurück? Wie der $@
richtig eingestellt?
Lösung
Perl_croak () wird dokumentiert hier auf der perlapi
Manpage . Wie das Beispiel auf dieser Seite zeigt, können Sie entweder geben sie eine Nachricht String, oder Sie können $ @ auf ein Ausnahmeobjekt und übergeben Sie NULL manuell eingestellt werden.