Občas používám Exception::Class, i když s ním mám malý "problém", který je dobře vidět i ve vašem příkladu:
VelkyParametr->throw( message => 'Parametr je prilis velky', limit => $limit)
Podle mě je totiž parametr message nadbytečný a měl by být implicitně daný třídou výjimky. Jaké rozumné message lze v kombinaci s VelkyParametr použít?
Samozřejmě vypisovanou zprávu může určovat přímo třída bez message - dá se předefinovat metoda full_message
v třídě výjimky. Zaráží mě ovšem, že na takovou věc nepamatoval autor Exception::Class v syntaxi importu. Jako by s takovým použitím příliš nepočítal.
Máte na to nějaký názor?
Myslim si, ze jeho hlavnim ucelem je byt proste retezcovym atributem, jelikoz hodne vyjimek asi nejaky retezcovy atribut pouziva. (Napr. $!, nebo chybovou hlasku z SQL nebo LDAP nebo jineho systemu ... s VelkymParametrem asi moc ne.)
Trochu divne ale je to, ze je to jediny atribut ktery se pouzije pri stringifikaci. Takze kdyz tam message nedate, tak vam neosetrena vyjimka nic nevypise a potichu chcipne. Samozrejme se da pretizit stringifikace, nebo nainstalovat rozumny SIG{__DIE__}, ale to je v rozporu s predikatem 'Laziness'. To pretizeni by melo jit celkem bezbolestne:
package MyExc; our @ISA = qw/Exception::Class::Base/; sub full_message { return "blabla"; } package RadaException; use Exception::Class ( 'SpatnyParametr' => { isa => 'MyExc' }, ...a dal normalne
a nebo to muzete znasilnit:
*Exception::Class::Base::full_message = sub { ... };