Try::Catch - Try Catch exception handler based on Try::Tiny But faster
use Try::Catch;
try {
die "something went wrong";
} catch {
} finally {
##some cleanup code
}; ##<--- semi colon is required.
A small, fast, try catch blocks for perl, it's inspired and mostly copied from Try::Tiny but with some modifications to boost execution speed, see "Benchmarks".
I published a new module instead of contributing to Try::Tiny directly because I had to break some features available in Try::Tiny some to boost speed and some because I didn't like.
- no multiple finally blocks
- try must be followed by catch, catch then finally, or finally
-
this behaves exactly as how other implementations of try catch blocks
- if there is no catch block error will throw
-
in case of try followed by finally block and no catch block, finally block will be fired then an exception will be thrown, this is also the default behaviour of try catch in other languages.
Same as "CAVEATS" in Try::Tiny
This is not totally fair but please consider Try::Catch a stripped Try::Tiny version with no blessing and no usage of Sub::Name, so it must be faster, right! :)
This is a simple test with just a try catch blocks with no exception
| Module: | Rate | % |
|-------------------------------------------|
| Try::Tiny | 98425/s | -68% |
| Try::Catch | 304878/s | 210% |
Test with Try Catch, Finally Blocks, No Exception
| Module: | Rate | % |
|-------------------------------------------|
| Try::Tiny | 60423/s | -75% |
| Try::Catch | 245700/s | 304% |
Test with Try, Catch, Finally Blocks, AND Exception
| Module: | Rate | % |
|-------------------------------------------|
| Try::Tiny | 41288/s | -65% |
| Try::Catch | 116414/s | 182% |
I've also tested against TryCatch and the results were good, considering that TryCatch is an XS module
| Module: | timing 500000 iterations |
|----------------------------------------------------------------------- |
| TryCatch | 1 secs (0.58 usr + 0.00 sys = 0.58 CPU) @ 865051.90/s |
| Try::Catch | 2 secs (1.73 usr + 0.00 sys = 1.73 CPU) @ 288350.63/s |
| Try::Tiny | 6 secs (6.16 usr + 0.02 sys = 6.17 CPU) @ 81011.02/s |
Benchmarks included in this dist inside bench folder
When doing block jump from try { } or catch { } then finally will not be called.
For example
use Try::Catch;
for (1) {
try {
die;
} catch {
goto skip;
} finally {
#finally will not be called
print "finally was called\n";
}
}
skip:
finally will work in most cases unless there is a block jump (last, goto, exit, ..) so I recommend avoid using finally at all as it's planned to be removed in v2.0.0
Mamod A. Mehyar, <mamod.mehyar@gmail.com>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself