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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top