Syntax::Feature::Try - try/catch/finally statement for exception handling
use syntax 'try'; try { # run this code and handle errors } catch (My::Class::Err $e) { # handle exception based on class "My::Class::Err" } catch ($e) { # handle other exceptions } finally { # cleanup block }
This module implements syntax for try/catch/finally statement with behaviour similar to other programming languages (like Java, Python, etc.).
It handles correctly return/wantarray inside try/catch/finally blocks.
It uses perl ( >= 5.14 ) keyword/parser API.
To initialize this syntax feature call:
use syntax 'try';
The try block is executed. If it throws an error, then first catch block (in order) that can handle thrown error will be executed. Other catch blocks will be skipped.
If none of catch blocks can handle the error, it is thrown out of whole statement. If try block does not throw an error, all catch blocks are skipped.
catch (My::Error $err) { ... }
This catch block can handle error that is instance of class My::Error or any of it's subclasses.
My::Error
Caught error is accessible inside catch block via declared local variable $err.
$err
To catch all errors use syntax:
catch ($e) { ... }
Caught error is accessible inside catch block via declared local variable $e.
$e
Variable name in catch block is not mandatory:
try { ... } catch (MyError::FileNotFound) { print "file not found"; } catch { print "operation failed"; }
To rethrow caught error call "die $err".
For example (log any Connection::Error):
try { ... } catch (Connection::Error $err) { log_error($err); die $err; }
The finally block is executed at the end of statement. It is always executed (even if try or catch block throw an error).
my $fh; try { $fh = IO::File->new("/etc/hosts"); ... } finally { $fh->close if $fh; }
WARNING: If finally block throws an exception, originaly thrown exception (from try/catch block) is discarded. You can convert errors inside finally block to warnings:
try { # try block } finally { try { # cleanup code } catch ($e) { warn $e } }
This module is compatible with Exception::Class
use Exception::Class ( 'My::Test::Error' ); use syntax 'try'; try { ... My::Test::Error->throw('invalid password'); } catch (My::Test::Error $err) { # handle error here }
This module supports calling "return" inside try/catch/finally blocks to return values from subroutine.
sub read_config { my $file; try { $fh = IO::File->new(...); return $fh->getline; # it returns value from subroutine "read_config" } catch ($e) { # log error } finally { $fh->close() if $fh; } }
@_ is not accessible inside try/catch/finally blocks, because these blocks are internally called in different context.
@_
next, last and redo is not working inside try/catch/finally blocks, because these blocks are internally called in different context.
next
last
redo
None bugs known.
syntax - Active syntax extensions
Exception::Class - A module that allows you to declare real exception classes in Perl
TryCatch
Try
http://github.com/tomas-zemres/syntax-feature-try
Tomas Pokorny <tnt at cpan dot org>
Copyright 2013 - Tomas Pokorny.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Syntax::Feature::Try, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Syntax::Feature::Try
CPAN shell
perl -MCPAN -e shell install Syntax::Feature::Try
For more information on module installation, please visit the detailed CPAN module installation guide.