相关疑难解决方法(0)

Perl中的异常有什么问题?

另一个问题的讨论让我想知道:Perl缺少其他编程语言的异常系统是什么?

Perl的内置异常有点特别,因为它们像Perl 5对象系统一样,在事后的想法中加以分类,并且它们超出了其他不专门用于异常的关键字(evaldie).

与具有内置try/throw/catch类型语法的语言相比,语法可能有点难看.我通常这样做:

eval { 
    do_something_that_might_barf();
};

if ( my $err = $@ ) { 
    # handle $err here
}
Run Code Online (Sandbox Code Playgroud)

有几个CPAN模块提供语法糖来添加try/catch关键字,并允许轻松声明异常类层次结构等等.

我在Perl的异常系统中看到的主要问题是使用特殊的全局$@来保存当前错误,而不是catch从范围的角度来看可能更安全的专用类型机制,尽管我从来没有亲自遇到任何问题$@得到了.

syntax perl exception-handling exception

29
推荐指数
4
解决办法
4597
查看次数

在Perl中处理异常的最佳方法是什么?

我注意到Exception.pm和Error.pm似乎没有在Perl社区中广泛使用.这是因为eval异常处理的占地面积很大吗?

此外,Perl程序似乎对一般的异常处理有一个更宽松的政策.这是否有令人信服的理由?

无论如何,Perl中最好的异常处理方法是什么?

error-handling perl exception-handling eval

28
推荐指数
2
解决办法
3万
查看次数

你在Perl程序中使用异常类吗?为什么或者为什么不?

我有很多关于人们如何在Perl中使用异常的问题.我已经包含了一些关于异常的背景说明,如果你愿意,请跳过这个,但请花点时间阅读问题并回答它们.

谢谢.

关于Perl例外的背景

Perl有一个非常基本的内置异常系统,可提供弹簧板以实现更复杂的使用.

例如,die "I ate a bug.\n";抛出一个分配了字符串的异常$@.

您也可以抛出一个对象,而不是字符串: die BadBug->new('I ate a bug.');

您甚至可以安装信号处理程序来捕获SIGDIE伪信号.这是一个处理程序,它将异常重新抛出为对象(如果它们尚未存在).

$SIG{__DIE__} = sub { 
    my $e = shift; 
    $e = ExceptionObject->new( $e ) unless blessed $e;
    die $e;
}
Run Code Online (Sandbox Code Playgroud)

此模式用于许多CPAN模块.但是perlvar说:

由于实现故障,$ SIG { DIE }挂钩甚至在eval()内部被调用.不要使用它来重写$ @中的挂起异常,或者作为重写CORE :: GLOBAL :: die()的奇怪替代.远程的这种奇怪动作可以在将来的版本中修复,这样只有当你的程序即将退出时才会调用$ SIG { DIE },就像原始意图一样.任何其他用途都已弃用.

所以现在我想知道在sigdie中对异常进行客观化是邪恶的.

问题

  1. 你使用异常对象吗?如果是这样,哪一个和为什么?如果没有,为什么不呢?

  2. 如果您不使用异常对象,会有什么诱使您使用它们?

  3. 如果您确实使用了异常对象,那么您对它们有何厌恶,哪些更好?

  4. 在DIE处理程序中对异常进行客观化是一个坏主意吗?

  5. 我应该在哪里客观化我的例外情况?在我的eval {}包装器中?在一个sigdie处理程序?

  6. 是否有任何关于例外情况的文章,文章或其他资源,以及您发现有用或有启发性的Perl.

Perlmonks交叉发布.

perl exception

14
推荐指数
1
解决办法
1285
查看次数

Perl中错误处理的最佳实践是什么?

我正在学习Perl,在很多例子中,我看到错误都是这样处理的

open FILE, "file.txt" or die $!;
Run Code Online (Sandbox Code Playgroud)

die在脚本中间确实处理错误的最好方法?

error-handling perl

14
推荐指数
3
解决办法
1万
查看次数

为什么`$ @`不值得信任?

我似乎记得,相信之后的价值是不安全$@eval.关于信号处理程序$@在你看到它之前有机会设置的东西.我现在也太累了,懒得追查真正的原因.那么,为什么信任不安全$@呢?

perl eval exception race-condition

12
推荐指数
3
解决办法
1055
查看次数

如何在perl中测试异常类型?

如何检查导致脚本或eval块终止的异常类型?我需要知道错误的类型以及异常发生的位置.

perl eval exception die

8
推荐指数
1
解决办法
6187
查看次数

如何防止Perl脚本中的错误终止脚本?

我有一个简单的Perl脚本,它使用无限循环作为Linux守护进程运行.它每10秒连接一个数据库以执行一个进程.

while (1)
{
    # THIS LINE WILL KILL THE SCRIPT IF IT FAILS
    my $DB=DBI->connect("dbi:Sybase:server=myserver","user","password");
    . . . do something . . .
    sleep (10);
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  • 如果数据库不可用,我如何保持脚本运行?
  • 我可以添加异常处理程序来向我发送电子邮件或记录错误吗?

linux perl daemon exception-handling

0
推荐指数
2
解决办法
532
查看次数