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 { ... };