BEGIN { use_ok
"TryCatch"
or BAIL_OUT(
"Cannot load TryCatch"
) };
sub
simple_no_die {
try
{
return
"simple_return"
;
}
catch
(
$e
) {
die
"Shouldn't get here: $e"
;
}
diag(
"foo\n"
);
return
"bar"
;
}
is(simple_no_die(),
"simple_return"
,
"simple_return"
);
sub
simple_die {
my
$msg
=
"no error"
;
try
{
die
"Some str\n"
;
}
catch
(Str
$err
where {
length
$_
< 5 }) {
chomp
(
$err
);
$msg
=
"We got a short Str error of '$err'"
;
}
catch
(Str
$err
where {
length
$_
>= 5 }) {
chomp
(
$err
);
$msg
=
"We got a long Str error of '$err'"
;
}
return
$msg
;
}
is(simple_die(),
"We got a long Str error of 'Some str'"
,
"simple_die"
);
sub
simple_catch_type {
my
@args
=
@_
;
try
{
die
$args
[0];
}
catch
(ArrayRef[Int]
$array
) {
return
"Got an array of @$array"
;
fail(
"didn't unwind"
);
}
catch
(
$e
) {
return
"Got otherwise"
;
}
fail(
"didn't unwind or catch"
);
}
is(simple_catch_type([1,2,3]),
"Got an array of 1 2 3"
,
"simple_catch_type"
);
is(simple_catch_type(
''
),
"Got otherwise"
,
"simple_catch_type"
);
sub
catch_args {
try
{
no
warnings
'uninitialized'
;
die
$_
[0];
}
catch
(ArrayRef[Int]
$array
) {
return
"Got an array of @$array"
;
}
catch
(
$e
) {
return
"Got otherwise"
;
}
}
is(catch_args([1,2,3]),
"Got an array of 1 2 3"
,
"simple_catch_type"
);
is(catch_args(
''
),
"Got otherwise"
,
"simple_catch_type"
);
dies_ok {
try
{
die
{
code
=> 500 };
}
catch
(
$e
where {
$_
->{code} < 400} ) {
pass(
"caught error"
)
}
}
"No catch-all causes error to propogate"
;
lives_ok {
try
{
die
{
code
=> 500 };
}
catch
(
$e
where {
$_
->{code} < 400} ) {
fail(
"caught error when we shouldn't have"
)
}
catch
{
pass(
"Caught error in catch all"
);
}
}
"Catch-all doesn't cause error to propogate"
;
dies_ok {
try
{
try
{
die
{
code
=> 500 };
}
catch
{
die
}
}
catch
(
$e
where {
$_
->{code} < 400} ) {
fail(
"caught error when we shouldn't have"
)
}
}
"'die' propogates errors as expected"
;
done_testing();