In Failure§
See primary documentation in context for sub fail.
multifail(-->Nil) multifail(*@text) multifail(Exception:U $e-->Nil ) multifail($payload-->Nil) multifail(|cap (*@msg) -->Nil) multifail(Failure:U $f-->Nil) multifail(Failure:D $fail-->Nil)
Exits the calling Routine
and returns a Failure
object wrapping the exception $e
- or, for the cap
or $payload
form, an X::AdHoc
exception constructed from the concatenation of @text
. If the caller activated fatal exceptions via the pragma use fatal;
, the exception is thrown instead of being returned as a Failure
.
# A custom exception defined class ForbiddenDirectory isException { hasStr$.name; methodmessage { "This directory is forbidden: '$!name'" } } sub copy-directory-tree ($dir) { # We don't allow for non-directories to be copied fail"$dir is not a directory"if!$dir.IO.d; # We don't allow 'foo' directory to be copied too fail ForbiddenDirectory.new(:name($dir)) if$direq'foo'; # or above can be written in method form as: # ForbiddenDirectory.new(:name($dir)).fail if $dir eq 'foo'; # Do some actual copying here ... } # A Failure with X::AdHoc exception object is returned and # assigned, so no throwing Would be thrown without an assignment my$result= copy-directory-tree("cat.jpg"); say$result.exception; # OUTPUT: «cat.jpg is not a directory» # A Failure with a custom Exception object is returned $result= copy-directory-tree('foo'); say$result.exception; # OUTPUT: «This directory is forbidden: 'foo'»
If it's called with a generic Failure
, an ad-hoc undefined failure is thrown; if it's a defined Failure
, it will be marked as unhandled.
sub re-fail { my$x=+"a"; unless$x.defined { $x.handled=True; say"Something has failed in \$x ",$x.^name; # OUTPUT: «Something has failed in $x Failure» fail($x); return$x; } } my$x= re-fail; say$x.handled; # OUTPUT: «False»
In Channel§
See primary documentation in context for method fail.
methodfail(Channel:D: $error)
Closes the Channel
(that is, makes subsequent send
calls die), and enqueues the error to be thrown as the final element in the Channel
. Method receive
will throw that error as an exception. Does nothing if the Channel
has already been closed or .fail
has already been called on it.
my$c=Channel.new; $c.fail("Bad error happens!"); $c.receive; CATCH { default { put .^name,': ', .Str } }; # OUTPUT: «X::AdHoc: Bad error happens!»
In Exception§
See primary documentation in context for routine fail.
multifail(Exception$e) methodfail(Exception:D:)
Exits the calling Routine
and returns a Failure
object wrapping the exception.
# A custom exception defined class ForbiddenWord isException { hasStr$.word; methodmessage { "This word is forbidden: «$!word»" } } sub say-word ( $word ) { ForbiddenWord.new(:word($word)).failif$wordeq'foo'; $word.say; } my$result= say-word("foo"); say$result.exception;
The routine form works in the same way, with an alternative syntax: fail ForbiddenWord.new(:word($word))
.