Thread Exceptions
(18 answers)
Opened by roooot at 2010-03-21 13:46
Exception::Class ist gar nicht so schlecht, wie du jetzt denkst. Lass dich doch nicht von der Synopse irre machen. Durch bloßes Dokulesen kriegst du sowieso nicht das passende Exceptionsystem für dich heraus, du musst schon einen realen Fall mit den Kandidaten programmieren, um es richtig kennenzulernen. Das sieht dann z.B. so aus:
Code (perl): (dl
)
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'; Die meisten Fehlerklassen kommen bloß mit "alias" aus, und schon spart man sich die Schererei mit CORE::die bzw. den Funktionen aus Carp. Noch eine Sache: PBP schlägt im Beispielcode vor, sich den Namensraum X:: zu eigen zu machen, was ich für Schwachsinn halte. Es sollte immer im selben Namensraum wie die sein, meinetwegen mit "Exception" dazwischengequetscht. Zur Auswertung Try::Tiny dazuladen und gut is'. Das ganze (also E::C und T::T) ist Moosekompatibel; tatsächlich zieht Moose schon Try::Tiny als Abhängigkeit. Last edited: 2010-03-21 23:55:39 +0100 (CET) |