Hi,
Fielding for opinions. Have a code base where I essentially need Java-style exception handling (try/catch/finally etc.) - so far have used Carp (croak) and eval / if ($@) style reporting / handling but it's reached the point where I need to be able to "filter" for different categories of error and respond appropriately. Also want to avoid using some kind of convention based on the contents of the error message.
For example in calling some object method, which executes a SELECT statement, there could be some kind of fundamental (e.g. the db is down) or there might be something "wrong" with the data selected - an "application logic error". On encountering the application logic error, the process can continue but if the DB is down, the process should die.
Anyway - looking around, Error seems to be the most promising way forward (from this article). From experiments, it seems good but I'm nervous about introducing it because it's a such a fundamental change, and wondering how other people feel about it - stability / gotchas etc.
Some random thoughts / questions;
- It doesn't seem too popular - I've yet to find any other CPAN modules using it. Why is that / have I missed something?
- The module seems to have changed hands recently and had a long gap in development, between 2001 and 2006. Does anyone know the story here and if it's generally to be regarded as a stable API?
- Being able to define my own exceptions and raise via Error::throw seems to work nicely and is backwards compatible with our existing eval {}; if($@){} exception handling. That's good news as we won't have to re-write everything but rather migrate in stages.
- Less certain about try/catch/finally etc. provided by Error. It doesn't seem to handle errors raised via croak / die, which means we'd have to switch entirely to thrown exceptions plus re-throw any croaks from underlying CPAN modules we're using. In general, try/catch etc. seems to be where the most fundamental change would be and where the most "magic" is going on.
- Any general feelings / experiences related performance overhead, memory use, garbage collection etc.? Have done some lightweight benchmarking so far and noticed no problems, but that could be a false positive.
The conclusion I'm starting to draw is "yes" to throw and "use base qw(Error)" but no to try/catch etc. - rather use eval like;
eval {
doSomething();
};
if ( $@ ) {
if ( $@->isa('my::own::error') ) {
warn("Error occurred but may continue: $@");
} else {
# Catch other thrown errors, die, croak etc.
die(ref $@ ? $@->stacktrace() : $@);
}
}
Anyway - opinions / experiences very much appreciated.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.