2017-04-11 52 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