2

'eval' ブロックは 'die' 試行をキャッチします。ただし、以下のコードでは、「初期化されていない値」例外をキャッチできません。

パールコード -

#!/usr/bin/perl
package poc::template;

use strict;
use warnings;
use Log::Log4perl;

my $log_conf = "../conf/log4perl.conf";
Log::Log4perl::init($log_conf);
my $logger = Log::Log4perl->get_logger();

sub doSome {
    $logger->info('doing something');
    my $add = $ARGV[0] + 4;
}

#main
$logger->info('start');
eval { doSome(); };
if ($@) {
    $logger->info('error');
}
$logger->info('stop');

ここにログconfがあります-

log4perl.rootLogger              = DEBUG, SCREEN
log4perl.appender.SCREEN         = Log::Log4perl::Appender::Screen
log4perl.appender.SCREEN.stderr  = 0
log4perl.appender.SCREEN.layout  = Log::Log4perl::Layout::PatternLayout
log4perl.appender.SCREEN.layout.ConversionPattern = %d [%M:%L] %p  %F{2} - %m%n

ここにスクリプト出力があります -

2013/02/03 16:47:02 [main:::18] INFO  template\POCTemplate.pl - start
Use of uninitialized value $ARGV[0] in addition (+) at /POCPerl/template/POCTemplate.pl line 14.
2013/02/03 16:47:02 [poc::template::doSome:13] INFO  template\POCTemplate.pl - doing something
2013/02/03 16:47:02 [main:::23] INFO  template\POCTemplate.pl - stop

この eval ブロッ​​クはその例外をキャッチすべきではありませんか?

4

1 に答える 1

8

いいえ、これは警告であり、例外ではありません。

あなたがすることができます:

use warnings 'FATAL' => 'all';

perl が生成したすべての警告例外を (指定されたレキシカル スコープで) 作成します。

于 2013-02-03T21:53:03.227 に答える