内容

名称

致命 - 用成功或死亡的等效函数替换函数

概要

use Fatal qw(open close);

open(my $fh, "<", $filename);  # No need to check errors!

use File::Copy qw(move);
use Fatal qw(move);

move($file1, $file2); # No need to check errors!

sub juggle { . . . }
Fatal->import('juggle');

最佳实践

Fatal 已被新的 autodie 编译指示所取代。 请优先使用 autodie 而不是 Fatalautodie 支持词法作用域,抛出真正的异常对象,并提供更友好的错误消息。

不鼓励在 Fatal 中使用 :void

描述

Fatal 提供了一种方便的方法来替换通常在失败时返回假值的函数,用在不成功时会引发异常的等效函数。这使您可以使用这些函数,而无需在每次调用时显式测试它们的返回值。可以使用 eval{} 捕获异常。有关详细信息,请参见 perlfuncperlvar

只需调用 Fatal 的 import 例程并传递要替换的函数名称,即可设置 do-or-die 等效项。您可以用这种方式包装用户定义的函数和可覆盖的 CORE 运算符(除了 execsystemprint 或任何其他无法通过原型表达的内置函数)。

如果导入列表中出现符号:void,则该导入列表中稍后命名的函数仅在以下情况下才会引发异常:当这些函数在 void 上下文中调用时,即当它们的返回值被忽略时。例如

use Fatal qw/:void open close/;

# properly checked, so no exception raised on error
if (not open(my $fh, '<', '/bogotic') {
    warn "Can't open /bogotic: $!";
}

# not checked, so error raises an exception
close FH;

不建议使用:void,因为它会导致在意外调用没有 void 上下文的方法时不抛出异常。如果您需要为一小段代码禁用自动死亡/致命行为,请改用autodie

诊断

Fatal 的子例程名称错误:%s

您使用了一个看起来不像子例程名称的参数调用了Fatal,也不是此版本的 Fatal 理解的开关。

%s 不是 Perl 子例程

您要求Fatal 尝试替换一个不存在或尚未定义的子例程。

%s 既不是内置函数,也不是 Perl 子例程

您要求Fatal 替换一个子例程,但它不是 Perl 内置函数,并且Fatal 无法将其识别为常规子例程。它要么不存在,要么尚未定义。

无法将不可覆盖的 %s 设置为致命

您尝试在无法覆盖的 Perl 内置函数(如printsystem)上使用Fatal,这意味着Fatal 无法帮助您,尽管其他一些模块可能可以。请参阅本文档的"另请参阅"部分。

内部错误:%s

您在Fatal 中发现了一个错误。请使用perlbug 命令报告它。

错误

Fatal 会覆盖函数调用的上下文,并始终将其设置为标量上下文,除非使用:void 标签。此问题在autodie 中不存在。

autodieFatal 与包文件句柄(例如FILE)一起使用时,可能会生成“仅使用一次”警告。强烈建议您改用标量文件句柄。

作者

原始模块由 Lionel Cons(CERN)编写。

原型更新由 Ilya Zakharevich <[email protected]> 完成。

autodie 支持、错误修复、扩展诊断、system 支持,以及由 Paul Fenwick <[email protected]> 进行的大规模重构。

许可证

此模块是自由软件,您可以根据与 Perl 本身相同的条款分发它。

另请参阅

autodie,用于以更友好的方式使用词法 Fatal。

IPC::System::Simple,用于对 system() 和反引号调用提供类似的想法。