NAME
Venus::Try - Try Class
ABSTRACT
Try Class for Perl 5
SYNOPSIS
package main;
use Venus::Try;
my $try = Venus::Try->new;
$try->call(sub {
my (@args) = @_;
# try something
return time;
});
$try->catch('Example::Error', sub {
my ($caught) = @_;
# caught an error (exception)
return;
});
$try->default(sub {
my ($caught) = @_;
# catch the uncaught
return;
});
$try->finally(sub {
my (@args) = @_;
# always run after try/catch
return;
});
my @args;
my $result = $try->result(@args);
DESCRIPTION
This package provides an object-oriented interface for performing complex try/catch operations.
ATTRIBUTES
This package has the following attributes:
invocant
invocant(Object)
This attribute is read-only, accepts (Object)
values, and is optional.
arguments
arguments(ArrayRef)
This attribute is read-only, accepts (ArrayRef)
values, and is optional.
on_try
on_try(CodeRef)
This attribute is read-write, accepts (CodeRef)
values, and is optional.
on_catch
on_catch(ArrayRef[CodeRef])
This attribute is read-write, accepts (ArrayRef[CodeRef])
values, is optional, and defaults to []
.
on_default
on_default(CodeRef)
This attribute is read-write, accepts (CodeRef)
values, and is optional.
on_finally
on_finally(CodeRef)
This attribute is read-write, accepts (CodeRef)
values, and is optional.
INHERITS
This package inherits behaviors from:
METHODS
This package provides the following methods:
any
any() (Venus::Try)
The any method registers a default catch
condition that returns whatever value was encoutered on error and returns it as a result.
Since 2.32
- any example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { die 'Oops!'; }); my $any = $try->any; # bless({ on_catch => ... }, "Venus::Try")
- any example 2
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { die $try; }); my $any = $try->any; # bless({ on_catch => ... }, "Venus::Try")
call
call(string | coderef $method) (Venus::Try)
The call method takes a method name or coderef, registers it as the tryable routine, and returns the object. When invoked, the callback will received an invocant
if one was provided to the constructor, the default arguments
if any were provided to the constructor, and whatever arguments were provided by the invocant.
Since 0.01
- call example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; my $call = $try->call(sub { my (@args) = @_; return [@args]; }); # bless({ on_catch => ... }, "Venus::Try")
callback
callback(string | coderef $method) (coderef)
The callback method takes a method name or coderef, and returns a coderef for registration. If a coderef is provided this method is mostly a passthrough.
Since 0.01
- callback example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; my $callback = $try->callback(sub { my (@args) = @_; return [@args]; }); # sub { ... }
- callback example 2
-
package Example1; sub new { bless {}; } sub test { my (@args) = @_; return [@args]; } package main; use Venus::Try; my $try = Venus::Try->new( invocant => Example1->new, ); my $callback = $try->callback('test'); # sub { ... }
- callback example 3
-
package main; use Venus::Try; my $try = Venus::Try->new; my $callback = $try->callback('missing_method'); # Exception! (isa Venus::Try::Error) (see error_on_callback)
catch
catch(string $isa, string | coderef $method) (Venus::Try)
The catch method takes a package or ref name, and when triggered checks whether the captured exception is of the type specified and if so executes the given callback. If no callback is provided the exception is captured in a "default" operation and returned as a result.
Since 0.01
- catch example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); my $catch = $try->catch('Venus::Try', sub { my (@args) = @_; return [@args]; }); # bless({ on_catch => ... }, "Venus::Try")
- catch example 2
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; $try->throw->error; }); my $catch = $try->catch('Venus::Try::Error', sub { return (@_); }); # bless({ on_catch => ... }, "Venus::Try")
- catch example 3
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { $try->throw->error; }); my $catch = $try->catch('Venus::Try::Error'); # bless({ on_catch => ... }, "Venus::Try")
default
default(string | coderef $method) (Venus::Try)
The default method takes a method name or coderef and is triggered if no catch
conditions match the exception thrown.
Since 0.01
- default example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); my $default = $try->default(sub { my (@args) = @_; return [@args]; }); # bless({ on_catch => ... }, "Venus::Try")
error
error(Ref $variable) (Venus::Try)
The error method takes a scalar reference and assigns any uncaught exceptions to it during execution. If no variable is provided a "catch" operation will be registered to capture all Venus::Error exceptions.
Since 0.01
- error example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); my $error = $try->error(\my $object); # bless({ on_catch => ... }, "Venus::Try")
- error example 2
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; $try->throw->error; }); my $error = $try->error; # bless({ on_catch => ... }, "Venus::Try")
execute
execute(coderef $code, any @args) (any)
The execute method takes a coderef and executes it with any given arguments. When invoked, the callback will received an invocant
if one was provided to the constructor, the default arguments
if any were provided to the constructor, and whatever arguments were passed directly to this method. This method can return a list of values in list-context.
Since 0.01
- execute example 1
-
package Example2; sub new { bless {}; } package main; use Venus::Try; my $try = Venus::Try->new( invocant => Example2->new, arguments => [1,2,3], ); my $execute = $try->execute(sub { my (@args) = @_; return [@args]; }); # [bless({}, "Example2"), 1, 2, 3]
finally
finally(string | coderef $method) (Venus::Try)
The finally method takes a package or ref name and always executes the callback after a try/catch operation. The return value is ignored. When invoked, the callback will received an invocant
if one was provided to the constructor, the default arguments
if any were provided to the constructor, and whatever arguments were provided by the invocant.
Since 0.01
- finally example 1
-
package Example3; sub new { bless {}; } package main; use Venus::Try; my $try = Venus::Try->new( invocant => Example3->new, arguments => [1,2,3], ); $try->call(sub { my (@args) = @_; return $try; }); my $finally = $try->finally(sub { my (@args) = @_; $try->{args} = [@args]; }); # bless({ on_catch => ... }, "Venus::Try")
maybe
maybe() (Venus::Try)
The maybe method registers a default catch
condition that returns falsy, i.e. an undefined value, if an exception is encountered.
Since 0.01
- maybe example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); my $maybe = $try->maybe; # bless({ on_catch => ... }, "Venus::Try")
no_catch
no_catch() (Venus::Try)
The no_catch method removes any configured catch conditions and returns the object.
Since 0.01
- no_catch example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); $try->catch('Venus::Try', sub { my (@args) = @_; return [@args]; }); my $no_catch = $try->no_catch; # bless({ on_catch => ... }, "Venus::Try")
no_default
no_default() (Venus::Try)
The no_default method removes any configured default condition and returns the object.
Since 0.01
- no_default example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; die $try; }); my $default = $try->default(sub { my (@args) = @_; return [@args]; }); my $no_default = $try->no_default; # bless({ on_catch => ... }, "Venus::Try")
no_finally
no_finally() (Venus::Try)
The no_finally method removes any configured finally condition and returns the object.
Since 0.01
- no_finally example 1
-
package Example4; sub new { bless {}; } package main; use Venus::Try; my $try = Venus::Try->new( invocant => Example4->new, arguments => [1,2,3], ); $try->call(sub { my (@args) = @_; return $try; }); $try->finally(sub { my (@args) = @_; $try->{args} = [@args]; }); my $no_finally = $try->no_finally; # bless({ on_catch => ... }, "Venus::Try")
no_try
no_try() (Venus::Try)
The no_try method removes any configured try
operation and returns the object.
Since 0.01
- no_try example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; return [@args]; }); my $no_try = $try->no_try; # bless({ on_catch => ... }, "Venus::Try")
result
result(any @args) (any)
The result method executes the try/catch/default/finally logic and returns either 1) the return value from the successfully tried operation 2) the return value from the successfully matched catch condition if an exception was thrown 3) the return value from the default catch condition if an exception was thrown and no catch condition matched. When invoked, the try
and finally
callbacks will received an invocant
if one was provided to the constructor, the default arguments
if any were provided to the constructor, and whatever arguments were passed directly to this method. This method can return a list of values in list-context.
Since 0.01
- result example 1
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; return [@args]; }); my $result = $try->result; # []
- result example 2
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub { my (@args) = @_; return [@args]; }); my $result = $try->result(1..5); # [1..5]
- result example 3
-
package main; use Venus::Try; my $try = Venus::Try->new; $try->call(sub {die}); my $result = $try->result; # Exception! Venus::Error
ERRORS
This package may raise the following errors:
- error:
error_on_callback
-
This package may raise an error_on_callback exception.
example 1
# given: synopsis; my $input = { invocant => 'Example', callback => 'execute', }; my $error = $try->throw('error_on_callback', $input)->catch('error'); # my $name = $error->name; # "on_callback" # my $message = $error->render; # "Can't locate object method \"execute\" on package \"Example\""
AUTHORS
Awncorp, awncorp@cpan.org
LICENSE
Copyright (C) 2022, Awncorp, awncorp@cpan.org
.
This program is free software, you can redistribute it and/or modify it under the terms of the Apache license version 2.0.