In Exception§

有关例程 fail,请参见上下文中的主要文档

multi  fail(Exception $e)
method fail(Exception:D:)

退出调用Routine并返回一个Failure对象,该对象包装异常。

# A custom exception defined 
class ForbiddenWord is Exception {
    has Str $.word;
    method message { "This word is forbidden: «$!word»" }
}
 
sub say-word ( $word ) {
    ForbiddenWord.new(:word($word)).fail if $word eq 'foo';
    $word.say;
}
 
my $result = say-word("foo");
say $result.exception;

例程形式以相同的方式工作,采用替代语法:fail ForbiddenWord.new(:word($word))

In Failure§

有关子例程 fail,请参见上下文中的主要文档

multi fail(--> Nil)
multi fail(*@text)
multi fail(Exception:U $e  --> Nil )
multi fail($payload --> Nil)
multi fail(|cap (*@msg--> Nil)
multi fail(Failure:U $f --> Nil)
multi fail(Failure:D $fail --> Nil)

退出调用Routine并返回一个Failure对象,该对象包装异常$e - 或者,对于cap$payload形式,一个X::AdHoc异常,该异常由@text的连接构成。如果调用者通过编译指令use fatal;激活致命异常,则会引发异常,而不是将其作为Failure返回。

# A custom exception defined 
class ForbiddenDirectory is Exception {
    has Str $.name;
 
    method message { "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 $dir eq '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'␤»

如果使用通用Failure调用它,则会引发一个特殊的未定义失败;如果它是一个已定义的Failure,它将被标记为未处理。

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§

有关方法 fail,请参见上下文中的主要文档

method fail(Channel:D: $error)

关闭Channel(即,使后续send调用终止),并将错误排队作为Channel中的最后一个元素引发。方法receive会将该错误作为异常引发。如果Channel已关闭或已在其上调用.fail,则不执行任何操作。

my $c = Channel.new;
$c.fail("Bad error happens!");
$c.receive;
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::AdHoc: Bad error happens!␤»