perl - 如何正确使用error.pm提供的perl中的try catch?

标签 perl error-handling try-catch

我发现有模块Error它提供了类似 java 中的 try and catch 功能。但是我对如何打印返回的异常感到困惑。

我想了解如何执行以下操作

try {
    // do something that will fail!

} catch (Error e) {
    // Print out the exception that occurred
    System.out.println(e.getMessage());
}

如何使用堆栈跟踪打印错误?

最佳答案

最后我检查了,Error已弃用。但是,如果没有该模块,您将如何做到这一点:

eval {
    die "Oops!";
    1;
} or do {
    my $e = $@;
    print("Something went wrong: $e\n");
};

基本上,使用 eval而不是 try , die而不是 throw ,并在 $@ 中查找异常. eval block 末尾的真值是防止$@ 的成语的一部分。在 5.14 之前的 Perl 版本中再次使用之前无意更改,请参阅 P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval详情。例如,这段代码就存在这个缺陷。
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14
eval {
    die "Oops!";
};
if (my $e = $@) {
    print("Something went wrong: $e\n");
}
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14

但请注意,许多 Perl 操作在失败时不会引发异常;他们只是返回一个错误代码。可以通过 autodie 更改此行为用于内置和标准模块。如果您使用 autodie ,那么执行 try/catch 的标准方法是这样的(直接来自 autodie perldoc):
use feature qw(switch);

eval {
   use autodie;

   open(my $fh, '<', $some_file);

   my @records = <$fh>;

   # Do things with @records...

   close($fh);

};

given ($@) {
   when (undef)   { say "No error";                    }
   when ('open')  { say "Error from open";             }
   when (':io')   { say "Non-open, IO error.";         }
   when (':all')  { say "All other autodie errors."    }
   default        { say "Not an autodie error at all." }
}

要获取堆栈跟踪,请查看 Carp .

关于perl - 如何正确使用error.pm提供的perl中的try catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342875/

相关文章:

batch-file - 如何修复if语句期望命令?

exception - 不可捕获的异常(PowerShell)

.net - 尝试...捕获...最后在VB.NET中

perl - 我们如何告诉 WWW::Mechanize::Firefox 不等待响应或回发?

perl - 在 Perl 中读取 STDIN 上的管道输入后,我可以提示用户输入吗?

performance - Perl 的统计数据有更快的替代方案吗?

perl - 哪一个代表null? undef 或空字符串

javascript - 如何在 Bluebird 中捕捉 ENOENT?

ruby-on-rails - 处理 Net::HTTP.get 失败

sql-server - 在 SQL Server 中 try catch