perl - 我应该将 “eval”放在子例程中还是将该子例程放在 “eval”中?

标签 perl error-handling eval

这两种方法中的一种是否必须被优先使用,还是仅取决于口味?

#!/usr/bin/env perl
use warnings;
use strict;
use DBI;

my $db = 'sqlite_db';

####################   A   ####################

sub get_database_handle {
    my ( $db ) = @_;
    my $dbh;
    eval {
        $dbh = DBI->connect( "DBI:SQLite:$db", '', '', {...} )
        or die DBI->errstr;
    };
    if ( $@ ) {
        print $@;
        return;
    }
    return $dbh;
}

DATABASES: while ( 1 ) {
    # choose a database from a list of databases
    # ...
    my $dbh = get_database_handle( $db );
    next DATABASES if not defined $dbh;
    # ...
    # do something with the database
}

####################   B   ####################

sub get_database_handle {
    my ( $db ) = @_;
    my $dbh = DBI->connect( "DBI:SQLite:$db", '', '', {...} ) 
    or die DBI->errstr;
    return $dbh;
}

DATABASES: while ( 1 ) {
    # choose a database from a list of databases
    # ...
    my $dbh;
    eval { $dbh = get_database_handle( $db ); };
    if ( $@ ) {
        print $@;
        next DATABASES;
    }
    # ...
    # do something with the database
}

最佳答案

为什么要评估?无法获取数据库句柄时该怎么办?

至少,子例程应该返回数据库句柄或死亡,因此那里没有eval。

如果在发生数据库错误时确实有事可做,那么请在子例程之外进行eval。仅在子例程周围没有必要,根据您的错误处理逻辑,范围可能会更广。

但是,如果您只想终止程序并显示错误,只需让异常冒泡即可。

关于perl - 我应该将 “eval”放在子例程中还是将该子例程放在 “eval”中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12635495/

相关文章:

perl - 将 Perl 脚本作为 CGI 脚本运行与从 cmd 行运行

perl - perl 解释器关于错误消息的错误?

Perl CORE::say与-E

javascript - JSLint "eval is evil."替代品

perl - 你如何正确处理数组中的散列?

.net - .NET DataGridView : Correct way of dealing with parsing errors while handling the CellParsing event?

r - R : tryCatch() syntax中的错误处理

parsing - 使用 yacc 时,如何告诉 yyparse() 要停止解析?

mongodb - 如何允许用户在 mongodb 2.6 上运行 eval 命令

php - 如何在 PHP 中解析常量