Jemand zu Hause?Leser: 29
Error gestoßen, das mir schon ziemlich gut gefällt. Allerdings gibt es da das Problem, dass es nicht mit
Moose kompatibel ist, welches ich verwende. Der Grund liegt darin, dass beide einen Befehl mit dem selben Namen exportieren: with.
Fatal dazu bringen kann Exceptions für
Error zu werfen möchte ich nicht wirklich auf eine andere Exception Klasse wechseln, wie beispielsweise
Exception::Class, da diese nicht die schönen Befehle wie try..catch..finally bieten, sondern umständlich über if-Bedingungen gelöst werden müssen.
Moose mit
Error? Oder gibt es für Moose eine bessere Exception Klasse die das definieren eigener Exceptions erlaubt und die try..catch..finally Syntax zulässt?
Exporter::Renaming?
IPC::System::Simple,
Path::Class
Error,
Exception::Class,
Try::Tiny und
TryCatch angeschaut.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# try eval { MyException->throw( error => 'I feel funny.' ) }; my $e; # catch if ( $e = Exception::Class->caught('MyException') ) { warn $e->error, "\n", $e->trace->as_string, "\n"; warn join ' ', $e->euid, $e->egid, $e->uid, $e->gid, $e->pid, $e->time; exit; } elsif ( $e = Exception::Class->caught('ExceptionWithFields') ) { $e->quixotic ? do_something_wacky() : do_something_sane(); } else { $e = Exception::Class->caught(); ref $e ? $e->rethrow : die $e; }
Exception::Class::TryCatch benutzen, aber dann wird das ganze auch nicht besser.1 2 3 4 5
eval { Exception::Class::Base->throw('error') }; if ( catch my $err ) { $err->isa('this') and do { handle_this($err) }; $err->isa('that') and do { handle_that($err) }; }
2010-03-21T16:54:49 rooootJe länger ich suche, desto mehr Gründe finde ich, Error nicht zu benutzen (Memory Leak, Unvorhersebarkeit best. Abläufe, ..).
IPC::System::Simple,
Path::Class2010-03-21T16:54:49 rooootTryCatch reagiert auf den "die" Befehl. Ich habe allerdings nicht herausgefunden, wie man hier verschiedene "Exceptions" werfen kann. Sprich er springt in den catch Block und untersucht dann wohl iwie die Rückmeldung, die mit dem "die" übergeben wurde mittels "where". Naja.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#!/usr/bin/perl use 5.010; use strict; use warnings; use TryCatch; try { Exception::Test->throw('Error!') if <STDIN> eq "test\n"; Exception->throw('Error!'); } # try catch (Exception::Test $e) { say "Exception::Test: ". $$e; } # catch catch ($e) { say "Other: ". $$e; } # catch package Exception; sub throw { my( $class, $error ) = @_; die bless \$error, $class; } # throw package Exception::Test; #edit: use parent -norequire, 'Exception';
2010-03-22T11:35:42 rooootSieht gut aus.
die verhält sich also hier wie der throw bei beispielsweise anderen Exceptionimplementationen?
2010-03-22T11:35:42 rooooterweitert die Basis 'Exception' Klasse in die Exception::Test Klasse sodass dort alle Befehle aus Exception zu Verfügung stehen? Sehe ich das richtig?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
use Exception::Class ( 'My::Project::Exception::Queue' => {}, # abstrakt 'My::Project::Exception::Queue::Underrun' => { isa => 'My::Project::Exception::Queue', alias => 'throw_queue_underrun', }, 'My::Project::Exception::Queue::AllocationFail' => { isa => 'My::Project::Exception::Queue', fields => [qw(caused_by)], alias => 'throw_queue_allocationfail', }, ); throw_queue_underrun(sprintf( 'tried to deallocate %u, but only %u left', scalar(@q_remove), $self->queue->stat->count )); # das Beispiel hier drüber ist Murks und kann ein bisschen Nachbesserung # vertragen, so dass man die Zahlen nicht herausparsen muss, sondern als # Attribut am Fehlerobjekt verfügbar hat throw_queue_allocationfail message => 'Reserved memory exhausted', caused_by => 'rigging layer';
IPC::System::Simple,
Path::Class
Ausnahmebehandlung
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem
Carp ansehen. das bietet bessere angaben zum ort, wo der fehler auftritt, und stacktrace.
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem2010-03-22T13:04:01 topegSo ganz stimmig ist das nicht. ;)Für Scripte ist print STERR $message; exit(1); vergleichbar zu die($message)