perl - 如何在无法修改的 Perl 库中绕过 'die' 调用?

标签 perl error-handling die

是的,问题出在我正在使用的库上,不,我无法修改它。我需要一个解决方法。

基本上,我正在处理一个写得很糟糕的 Perl 库,当在读取文件时遇到某种错误情况时,它会以“die”退出。我从一个循环数千个文件的程序中调用这个例程,其中少数文件是坏的。坏文件发生;我只想让我的例程记录错误并继续前进。

如果我可以修改库,我只需更改

die "error";

到一个
print "error";return;

, 但是我不能。有什么办法可以让我编写例程,这样坏文件就不会导致整个过程崩溃?

后续问题:使用“eval”来处理容易崩溃的调用效果很好,但我如何设置处理该框架内的可捕获错误?来描述:

我有一个子例程调用库,它有时会崩溃很多次。我没有用 eval{} 来处理这个子例程中的每个调用,而是让它死掉,并在调用我的子例程的级别上使用 eval{}:
my $status=eval{function($param);};
unless($status){print $@; next;}; # print error and go to next file if function() fails

但是,我可以并且确实在 function() 中捕获了一些错误情况。在子例程和调用例程中设计错误捕获的最合适/优雅的方法是什么,以便我获得捕获和未捕获错误的正确行为?

最佳答案

您可以将其包装在 eval 中.看:

perldoc -f eval

例如,你可以写:
# warn if routine calls die
eval { routine_might_die }; warn $@ if $@;

这会将 fatal error 变成警告,这或多或少是您所建议的。如果 die被称为,$@包含传递给它的字符串。

关于perl - 如何在无法修改的 Perl 库中绕过 'die' 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/451227/

相关文章:

linux - perl sysopen 可以打开文件进行原子写入吗?

spring - Spring 框架中的Jackson反序列化错误处理

php - 抛出 die() 时指定页/行?

Perl:latin1 模块中的字符串文字 - 我想要 utf8

perl - 如何使用perl添加和替换线阵列中的行

python - Flask RestPlus : how to catch all exceptions and output the original error

r - 语言R : Variable doesn't change inside a 'for()' cycle?

go - 如何在 Go 中实现 PHP 函数 `die()`(或 `exit()`)?

php - "mysql_query() or die()"是否保持打开的 mysql 连接?

perl - 如何仅更改文件的第一行?