Leser: 29
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; }
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, ..).
2010-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';
2010-03-22T13:04:01 topegSo ganz stimmig ist das nicht. ;)Für Scripte ist print STERR $message; exit(1); vergleichbar zu die($message)