NAME
Exception::SEH - rich try/catch/finally semantics without source filtering
SYNOPSIS
use Exception::SEH;
try {
<...> or die YourException;
} catch (SomeException $e) {
<catch code>
} catch (YourException $e where { $_->param > 10 }) {
log($e->message);
} finally {
<cleanup code>
}
FEATURES
-
Rich catch syntax -
No need for trailing ; after try/catch/finally sequence -
return from try/catch - returns from subroutine, not just try/catch block -
finally called in all cases (even after return) -
@_ available for try block -
Nested try/catch -
Not a source filter (magic for syntax is provided by L<Devel::Declare>)
DESCRIPTION
- try BLOCK
-
Evaluates BLOCK, allowing any exceptions inside it to be caught and processed.
- catch BLOCK
- catch ([[CLASS] $VAR] [where BLOCK]) BLOCK
-
Catches and processes (using given BLOCK) exception that (optionally) matches some conditions. Rules to determine catch handler are following:
-
Search is performed from beginning to end of 'catches' list -
First matched block is executed and the search is stopped -
If exception is not an object, then any condition with CLASS definition is skipped -
If condition has CLASS, then B<$@->isa(CLASS)> is checked for true value -
If condition has 'where BLOCK' part, then BLOCK is checked for true result, with B<$_> assigned to caught exception -
catch BLOCK, catch () BLOCK, catch ($e) BLOCK are all the same and captures all possible exceptions -
If no condition matches throwed exception, then it's re-thrown (after C<finally> is done)
Inside BLOCK after
catchexception is available as $@ (always) and also as $VAR (lexical to BLOCK), if it was specified incatchsignature. -
- finally BLOCK
-
Finally block is always executed after either
tryorcatch. Exception in it is available as $@.Note: if exception was generated inside a
catchhandler, than in $@ would be new one, not original from atryblock.Note:
exitand unhandled signals leads to immidiate program termination (latter even don't allow global destruction to happen) - in these cases,finallyis not called.
- return EXPRESSION
-
returnbehaviour is modifiyed, so when you call it insidetry/catch, it returns not fromtryblock, but from the subtrywas inside.Note: this does not apply to finally block.
Note: if both
catchandtryusesreturn, than value from lastreturnis used (but you may ommitreturnincatchblock, then return value is left unchanged).Note: argument for return is executed in the context of sub above
try.Example:
sub test{ try{ return map { $_ * 2 } @_; } } $a = test(1, 2, 3); #$a = 3 @a = test(1, 2, 3); #@a = (2, 4, 6)
CONFIGURATION
When importing Exception::SEH to your module, you can specify one or more of the following keywords: -nosig -noret -safetry, which change default behaviour in some way. These options are tracked on per-package basis.
use Exception::SEH -nosig, -safetry;
- -nosig
-
By default, Exception::SEH doesn't play with $SIG{__DIE__}, so your handler is normally called. But if you need to suppress it inside try/catch/finally blocks, you can import
-nosig.Note: if exception is re-thrown after
finallyblock, __DIE__ handler is always suppressed for that moment (so it is called only once for each exception - at first occurence). - -safetry
-
This options changes behaviour for uncaught exceptions after
tryblock. By default, they're re-thrown, but with this option enabledtryblocks are always safe - just likeeval.Note: this doesn't refer to exceptions occured in a
catchandfinallyblocks. - -noret
-
Tells Exception::SEH not to install
returnhook. This makestryblocks behave like evals, and context forreturnis determined by context oftry, not by context of sub, containingtry.
DIAGNOSTICS
All compile-time discovered errors are raised through Carp::croak with (hopefully) meaningful description.
CAVEATS
Currently, three subroutines - try, catch, finally - are injected into caller's namespace.
Currently, it's impossible to use any other module that hooks OP_RETURN OP on XS level - results are unpredictable. This may be fixed in future releases.
Currently, it's probably unsafe to place try/catch blocks around use/catch. This needs further testing, and may be fixed in future releases.
SEE ALSO
Similar semantics, but it takes the whole Moose with itself - often too much weight. Currently lacks finally block and @_ access inside try{}. But still, decent choice.
Ugly syntax. Only Exception::Class-derived exceptions.
Better syntax. Lacks exception lexical in try block, returns from try{} block. Still only Exception::Class-derived exceptions.
Source filter. No finally{} call after return() from try.
"Error's syntactic sugar tends to break." (c)
AUTHOR
Sergey Aleynikov <sergey.aleynikov@gmail.com>
LICENSE
Copyright (c) 2009 by Sergey Aleynikov. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Some part for parser are taken from Devel::Declare::Context::Simple, (c) Rhesa Rozendaal (?).
Idea how to set up return hook - TryCatch, (c) Ash Berlin.
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 114:
'=item' outside of any '=over'