当Perl中出现不好的事情时,croak()或die()会更好吗?

Gen*_*neQ 17 error-handling perl coding-style perl-critic

perlcritic投诉,以下代码,一些样板DBI的东西完全正常,应该croak代替die:

# Connect to database
my $db_handle = DBI->connect( $url, $user, $password ) or die $DBI::errstr;
Run Code Online (Sandbox Code Playgroud)

所有这些,虽然死对我来说似乎很好.

我会想到一个武士Perl战士,当事情出错时,呱呱声不如实际死亡.开玩笑

我为什么要croak代替die

不听取perlcritic建议的后果是什么?

Adr*_*ith 31

来自http://www.perlmonks.org/?node_id=685452

当错误是您或您的代码没有正确执行时,您使用die.当你的来电者做得不对时,你会使用呱呱叫.死"错误:$!" 表示错误发生在发生错误的行上.呱呱叫"错误:$!" 表示错误在调用者调用您的代码的行上.

在这种情况下,错误(连接到DB的错误)与调用者无关,而且与建立连接的行有关,所以我会使用die.

  • @Adrin如果连接信息来自呼叫者怎么办?你还会用die()吗? (2认同)

pha*_*lon 7

我通常使用以下内容:

  • die "string"对于您希望直接与用户通信的致命消息.我主要是在脚本中这样做.
  • die $object对于完整的异常对象,尽管大多数异常类都有throw为您执行此操作的方法.这适用于您的调用者应该能够判断您抛出的错误类型,甚至可能从中提取信息.如果您正在使用Moose,请查看ThrowableThrowable-X
  • croak "message"就像Adrian所说的那样,当你的用户做错了什么时,你想要在你的代码中报告错误.函数和API级别方法通常都是这种情况.
  • confess "message"对于库错误,我还没有看到异常的用处.这些通常是您认为是错误的运行时错误,而不是异常情况.为这些使用异常是有意义的,特别是如果您有一个已经使用异常的大型项目.但这是一个很好,很好,简单的方法来获得错误的堆栈跟踪.

  • Perl肯定有很多用于处理错误的关键词:die,croak and confess! (2认同)