class X::AdHoc
class X::AdHoc is Exception { }
X::AdHoc
is the type into which objects are wrapped if they are
thrown as exceptions, but don't inherit from Exception.
Its benefit over returning non-Exception objects is that it gives access to
all the methods from class Exception, like backtrace
and
rethrow
.
You can obtain the original object with the payload
method.
try {
die [404, 'File not found']; # throw non-exception object
}
print "Got HTTP code ",
$!.payload[0], # 404
" and backtrace ",
$!.backtrace.Str;
Note that young code will often be prototyped using X::AdHoc
and then later
be revised to use more specific subtypes of Exception. As such it is usually
best not to explicitly rely on receiving an X::AdHoc
ā in many cases using
the string returned by the .message
method, which all Exceptions must
have, is preferable. Please note that we need to explicitly call .Str
to
stringify the backtrace correctly.
Methods
method payload
Returns the original object which was passed to die
.
method Numeric
method Numeric()
Converts the payload to Numeric and returns it
method from-slurpy
method from-slurpy (|cap)
Creates a new exception from a capture and returns it. The capture will have the
SlurpySentry
role mixed in, so that the .message
method behaves in a
different when printing the message.
try {
X::AdHoc.from-slurpy( 3, False, "Not here" ).throw
};
print $!.payload.^name; # OUTPUT: Ā«Capture+{X::AdHoc::SlurpySentry}Ā»
print $!.message; # OUTPUT: Ā«3FalseNot hereĀ»
The SlurpySentry
role joins the elements of the payload, instead of directly
converting them to a string.