2017-04-11 53 views
1

我有run.pl和decrypt.pm错误在Perl

run.pl处理:

my $secret2 = "test password"; 
my $ret=decrypt::decodeIt($secret2); 
print $ret; 

decrypt.pm:

sub decodeIt { 
$tmp=""; 
......... 
......... 
......... 
return $tmp 
} 

我打电话decodeIt()子中run.pl.但是在decodeIt sub和run.pl引发错误时出了点问题。我不希望看到这些错误异常被打印在屏幕上,我想捕获run.pl中的错误,并在下面有错误时执行其他操作。我尝试像下面但不能捕获错误。

if(!decrypt::decodeIt($secret2)){ 
print "Error in decode"; 
} else { 
my $ret=decrypt::decodeIt($secret2); 
print "No Error :".$ret; 
} 

现在我在屏幕上看到的错误是;

Argument "te" isn't numeric in int at decrypt.pm line 61. 
Illegal hexadecimal digit 's' ignored at decrypt.pm line 64. 
Illegal hexadecimal digit ' ' ignored at decrypt.pm line 64. 
Illegal hexadecimal digit 's' ignored at decrypt.pm line 64. 
Illegal hexadecimal digit 's' ignored at decrypt.pm line 64. 
Illegal hexadecimal digit 'o' ignored at decrypt.pm line 64. 
substr outside of string at decrypt.pm line 68. 
Use of uninitialized value $string in length at decrypt.pm line 69. 

我不想在屏幕上看到这些错误。我只想了解是否有错误,并在出现错误时采取一些措施。

+0

错误在'decrypt.pm'。在第61行,我们需要看61-70行可以回答什么。 – Sobrique

+1

我不想防止错误。有错误是可以的。我在decrypt.pm的子程序中故意创建错误。我只想处理run.pl中的错误,我称之为子程序。 – ivbtar

回答

1

您需要使用 block version of eval 来处理异常

然而,大多数你所看到的消息是警告,这是不被困eval,并且需要升级到致命错误,如果你想要捕获它们

在这段代码中,use warnings 'FATAL'会在当前词法上下文的持续时间内使每个警告致命。如果出现致命错误,eval块将返回undef,否则它将返回decrypt::decodeIt的值

我对完全屏蔽错误消息并不满意。你会被告知的是,有一个问题,没有任何迹象表明它是什么。我认为你应该重新考虑这个

my $ret = eval { 
    use warnings 'FATAL'; 
    decrypt::decodeIt($secret2); 
}; 

if (defined $ret) { 
    print "No Error: $ret\n"; 
} 
else { 
    print "Error in decode\n"; 
} 
+0

嗨鲍罗丁,谢谢你的回答。问题是。 $ ret总是被定义的。子总是返回$ ret与一些信息。如果出现错误,则将错误输出到屏幕上。并且说没有错误,因为$ ret填充了一些信息。 – ivbtar

+0

@ivbtar请阅读:[mcve]。在你应该[编辑]你的问题后。 – jm666

+0

@ivbtar:请至少试试我的解决方案。如果有任何异常,'$ ret'将会是'undef'。 – Borodin