The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Throw - Simple exceptions that do the right things in multiple contexts


    use Throw qw(throw);

    throw "Hey";

    throw "Hey", {info => "This is why"};

    throw "Hey", {trace => 1}; # simple trace

    throw "Hey", {trace => 2}; # full trace without args

    throw "Hey", {trace => 3}; # full trace with args

    use Throw qw(croak confess carp);

    croak "Hey";  # same as throw with {trace => 1}, 1

    confess "Hey";  # same as throw with {trace => 2}

    carp "Hey";  # warns from perspective of caller

    warn Throw->new("Hey");  # useful for some cases

    use Throw qw(throw classify);
    if (classify my $err = $@, "io") {
        throw "Got a disk error", {msg => $err};


Throw allows for light weight exceptions that can hold more information than just the error message. These exceptions do the right thing when thrown on the commandline, or when consumed by javascript based APIs.



Takes an error message, an error message and extra arguments, or a hashref.

If a hashref is passed, it should contain a key named error representing the error. If not, a string "Something happened" will be used instead. If an arguments hashref is passed, the error message will be added to it. If just an error message is passed, a hashref will be created with the error as the single key.

In all cases, throw returns an hashref based object blessed into the Throw class. When an error message is passed independently.

If a key of "trace" is passed, its value will be passed to the caller_trace subroutine and the result will be stored as the value of trace.

An optional 3rd parameter can be passed which will be used as the "level" for any stack traces performed.


Similar to throw call. Useful for some cases.


Gives a trace from the perspective of the caller. Similar to throw - but with trace => 1 instead. (passing a single hashref is not allowed) Single level stack trace.


Similar to throw - but with trace => 2 instead. (passing a single hashref is not allowed) Full stack trace.


Gives a trace from the perspective of the caller. Similar to throw but only warns with trace => 1.


Similar to throw but only warns with trace => 2.


Returns stack traces. Takes parameters in a few different ways.

     caller_trace();    # {level => 0, verbose => 2}
     caller_trace(1);   # {level => 0, verbose => 1}
     caller_trace(2);   # {level => 0, verbose => 2}
     caller_trace(3);   # {level => 0, verbose => 3}

     caller_trace(undef, 3);  # {level => 3, verbose => 1}
     caller_trace(1, 4);      # {level => 4, verbose => 1}
     caller_trace(2, 2);      # {level => 2, verbose => 2}

     caller_trace({level => 1});                # {level => 1, verbose => 2}
     caller_trace({level => 1, verbose => 3});  # {level => 1, verbose => 3}

The "level" argument represents how many stack frames to skip backwards.

The "verbose" argument can be one of 1, 2, or 3. Default 2. At level 1 you get a single line of trace. With level 2 you get the full stack trace. With level 3 you get the full stack trace with function arguments.

The "max_args" argument shows how many parameters to each level will be represented. If there are more an "..." will be shown. Default is 5.

The "max_arg_len" argument shows where parameters will be truncated. Default is 20.

The "skip" argument can be a hashref with keys of packages, files, or subs that should be excluded from the trace.


Allows for cleanly and safely classifying the types of errors received assuming you use {type => 'error_type'} for specifying your error hierarchy. Classify takes an error (such as from $@), and a hashref used to classify the error. Each of the keys of the hashref will be checked against the type of the error. The classification keys are checked based on hierarchy - so a key of "foo" will match an error type of "foo" as well as "", "foo.baz", and "". A key of "" would match "" and "" but not "foo".

You may also pass a key named "default" to handle any cases not matched by other keys.

Some errors passed to classify may not have been given a type property, and some may not even have been blessed or come from the Throw system. Any unblessed errors will receive use a type of "undef.flat" and any other errors that do not have a type attribute will use "undef.none" for the type.

    use Throw qw(throw classify);
    use Try::Tiny qw(try catch);

    try {
        throw "No-no", {type => ''};
    } catch {
        classify $_, {
            foo => sub { print "I got foo\n" },
            '' => sub { print "I got\n" },
            default   => sub { throw "Don't know what I got", {msg => $_[0]} }

    # also
    if (classify $@, "foo") {
        print "I got a foo\n";


There are also a few package globals that can make tracking down culprits easier.


Turn on traces globally - can be any of the normal values passed to trace


Set the level at which to trace.


Allow all json error stringification to use pretty. You can also set _pretty => 1 in individual errors, but sometimes you won't have access to the error object before it stringifies.


JSONifies the error.


Paul Seamons <>, Jason Terry <>


Copyright (c) 2013, 2014,

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either version 5.8.1 or any later version. See perlartistic and perlgpl.

The full text of the license can be found in the LICENSE file included with this module.