2010-10-23 18 views
22

Ich habe festgestellt, dass Exception.pm und Error.pm in der Perl-Community nicht extensiv verwendet werden. Liegt das an der großen Grundfläche von eval für die Ausnahmebehandlung?Was ist der beste Weg, Ausnahmen in Perl zu behandeln?

Auch Perl-Programme scheinen eine viel mildere Richtlinie in Bezug auf die Ausnahmebehandlung im Allgemeinen zu haben. Gibt es dafür einen zwingenden Grund?

In jedem Fall, was wäre die beste Methode für die Ausnahmebehandlung in Perl?

+2

Betrogene von http://stackoverflow.com/questions/503189/is-object-oriented-exception-handling-in-perl-worth-it http://stackoverflow.com/questions/2165161/whats- broken-about-Ausnahmen-in-perl http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programs-why-or-why-not http://stackoverflow.com/questions/1426501/how-doi-i-handle-exceptions-in-a-procedural-language - Brauchen wir wirklich einen anderen Beitrag über Perl Exception Handling? – Ether

+1

Siehe meine Antwort in [Ist Try :: Tiny immer noch für die Ausnahmebehandlung in Perl 5.14 oder höher empfohlen?] (Http://Stackoverflow.com/a/10374265/2766176) –

Antwort

43

Der Konsens der Perl-Community scheint zu sein, dass Try::Tiny der bevorzugte Weg ist, die Ausnahmebehandlung zu machen. Die "milde Policy", auf die Sie sich beziehen, ist wahrscheinlich auf eine Kombination von:

  • Perl nicht eine vollständig objektorientierte Sprache. (z. B. im Gegensatz zu Java, wo Sie nicht vermeiden können, mit Ausnahmen umzugehen.)
  • Der Hintergrund vieler Perl-Entwickler. (Sprachen wie C und Shell haben keine Ausnahmemechanismen.)
  • Die Art von Aufgaben, für die Leute Perl verwenden. (Kleine Skripte für Text Munging und Bericht Generation, in der Ausnahme Behandlung ist nicht erforderlich.)
  • Perl kein (gut) eingebauten Ausnahme-Mechanismus.

Beachten Sie, dass der letzte Punkt bedeutet, dass Sie viel Code wie folgt erhältlich:

eval { something() }; 
if ([email protected]) { 
    warn "Oh no! [[email protected]]\n"; 
} 

diese Ausnahme auch der Handhabung ist, obwohl es nicht versuchen, nicht verwendet/catch-Syntax. Es ist jedoch zerbrechlich und wird eine Reihe von subtilen Grenzfällen durchbrechen, an die die meisten Menschen nicht denken. Try :: Tiny und die anderen Exception-Handling-Module auf CPAN wurden geschrieben, um es einfacher zu machen, richtig zu machen.

1. C hat setjmp() und longjmp(), die für eine sehr grobe Form der Ausnahmebehandlung verwendet werden können.

+2

+1 "mach es * einfacher * richtig zu machen " –

+15

Und nur um ein allgemeines Missverständnis zu beseitigen, an dem das ursprüngliche Poster leiden könnte oder auch nicht:' eval BLOCK' ist * nicht * 'eval STRING' und kompiliert den Code zur Laufzeit nicht. Es ist nur eine Ausnahmebehandlungsmethode - "probiere" mit einem lustigen Namen und etwas witziger Semantik. – hobbs

Verwandte Themen