gpt4 book ai didi

Perl:包范围内 eval 错误处理的最佳实践

转载 作者:行者123 更新时间:2023-12-01 03:39:29 24 4
gpt4 key购买 nike

在使用 Perl (CPAN) 模块时,我经常发现我希望以相同的方式对所有方法调用实现错误处理(例如,自动重试某些错误代码、记录一些错误代码、在其他错误代码上死掉……)。代码最终看起来非常重复:

my $result1 = eval{
$obj->method1 ( @arg );
};
if ( $@ )
{
# error handling code
}

my $result2 = eval{
$obj->method2 ( @arg );
};
if ( $@ )
{
# error handling code
}

有没有办法自动化这个?
一种似乎可行的方法是使用 sub{}:
sub error_handler
{
my $method = shift;
my $result = eval{ shift()->$method ( @_ ); };
if ( $@ )
{
# error handling code
}
else
{
return ( $result );
}
}

my $result1 = error_handler ( 'method1', $obj, @arg );
my $result2 = error_handler ( 'method2', $obj, @arg );

但我仍然觉得这段代码很乏味。我的另一个想法是尝试扩展包:
package My::Package;
use Moo;
extends 'Package';

our $AUTOLOAD;
sub AUTOLOAD
{
$AUTOLOAD =~ s/^My::Package:://;
my $result = eval{ no strict 'refs'; shift()->$AUTOLOAD ( @_ ); };

if ( $@ )
{
# error handling code
}
else
{
return ( $result );
}
}

但是这段代码不起作用——我需要一种方法来以这种方式只使用 AUTOLOAD 公共(public)方法。有没有人有办法解决吗?

最佳答案

你的第一种方法是最好的。或者你可以用 Try 做一个更漂亮的变化。或 Try::Tiny ,这两种方法都可以减少第二种方法的详细程度。

避免使用第二种和第三种方法的主要原因与代码的冗长无关(我承认第一种方法很烦人),而更多地与代码的可读性有关。

如果你最终扩展了你导入的每个类,你的代码对其他人几乎完全不可读,或者更糟:它看起来是可读的(“哦,我知道 MIME::Parse 是如何工作的!”),但不会做预期的事情(“嗯,为什么 MIME::Parse 没有因为这个错误的输入而失败?”)

您的第二种方法本质上具有相同的问题,但至少它不会假装不进行错误处理。但它仍然使调试变得更加困难。

我知道经常重新输入相同的错误处理代码很烦人(我一直都这样做!),但这是最佳实践。

关于Perl:包范围内 eval 错误处理的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31874171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com