Perl-エラー処理

実行とエラーは常に一緒になります。存在しないファイルを開いている場合。この状況を適切に処理しなかった場合、プログラムの品質は悪いと見なされます。

エラーが発生すると、プログラムは停止します。そのため、適切なエラー処理を使用して、プログラムの実行中に発生する可能性のあるさまざまなタイプのエラーを処理し、プログラムを完全に停止するのではなく、適切なアクションを実行します。

さまざまな方法でエラーを識別してトラップできます。Perlでエラーをトラップし、適切に処理するのは非常に簡単です。使用できる方法は次のとおりです。

ifステートメント

ザ・ if statementステートメントからの戻り値をチェックする必要がある場合は、当然の選択です。例-

if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

ここで変数$!実際のエラーメッセージを返します。あるいは、そうすることが理にかなっている状況では、ステートメントを1行に減らすことができます。例-

open(DATA, $file) || die "Error: Couldn't open the file $!";

until関数

ザ・ unless関数は、if:ステートメントとは論理的に反対です。ステートメントは成功ステータスを完全にバイパスでき、式がfalseを返した場合にのみ実行されます。例-

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

ザ・ unlessステートメントは、式が失敗した場合にのみエラーまたは代替を発生させたい場合に最適です。このステートメントは、1行のステートメントで使用する場合にも意味があります-

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

ここでは、chdir操作が失敗した場合にのみ死に、読みやすくなっています。

三項演算子

非常に短いテストの場合、条件演算子を使用できます ?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

ここで私たちが何を達成しようとしているのかはそれほど明確ではありませんが、効果は if または unlessステートメント。条件演算子は、式またはステートメント内の2つの値のいずれかをすばやく返したい場合に最適です。

警告機能

警告機能は警告を発するだけで、メッセージがSTDERRに出力されますが、それ以上のアクションは実行されません。したがって、ユーザーへの警告を出力して残りの操作を続行する場合は、より便利です。

chdir('/etc') or warn "Can't change directory";

ダイ機能

ダイ関数は、exitも呼び出すことを除いて、warnと同じように機能します。通常のスクリプト内では、この関数は実行を即座に終了する効果があります。プログラムにエラーが発生した場合に続行することが役に立たない場合は、この関数を使用する必要があります-

chdir('/etc') or die "Can't change directory";

モジュール内のエラー

処理できるはずの2つの異なる状況があります-

  • モジュールのファイル名と行番号を引用するモジュールのエラーを報告する-これは、モジュールをデバッグする場合、またはスクリプト関連ではなくモジュール関連のエラーを具体的に発生させたい場合に役立ちます。

  • エラーの原因となったスクリプト内の行をデバッグできるように、呼び出し元の情報を引用するモジュール内でエラーを報告します。この方法で発生したエラーは、呼び出し元のスクリプトの発信行に関連するエラーを強調するため、エンドユーザーにとって便利です。

ザ・ warn そして die関数は、モジュール内から呼び出された場合に予想されるものとは少し異なる動作をします。たとえば、単純加群-

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

以下のようなスクリプトから呼び出された場合-

use T;
function();

次の結果が得られます-

Error in module! at T.pm line 9.

これは多かれ少なかれあなたが期待するものですが、必ずしもあなたが望むものではありません。モジュールプログラマーの観点からは、この情報はモジュール自体のバグを指摘するのに役立つため、役立ちます。エンドユーザーにとって、提供された情報はかなり役に立たず、強化されたプログラマーを除いて、それは完全に無意味です。

このような問題の解決策はCarpモジュールです。これは、呼び出し元のスクリプトに関する情報を返すモジュール内のエラーを報告するための簡略化された方法を提供します。Carpモジュールは、carp、cluck、croak、およびconfessの4つの機能を提供します。これらの機能については、以下で説明します。

コイ機能

carp関数は、warnと基本的に同等であり、実際にスクリプトを終了してスクリプト名を出力することなく、メッセージをSTDERRに出力します。

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

以下のようなスクリプトから呼び出された場合-

use T;
function();

次の結果が得られます-

Error in module! at test.pl line 4

クラック機能

cluck関数は一種の過給された鯉であり、同じ基本原則に従いますが、元のスクリプトの情報を含む、呼び出される関数につながったすべてのモジュールのスタックトレースも出力します。

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

以下のようなスクリプトから呼び出された場合-

use T;
function();

次の結果が得られます-

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

鳴き声機能

ザ・ croak 関数はと同等です dieただし、発信者を1レベル上に報告します。dieと同様に、この関数もSTDERRにエラーを報告した後にスクリプトを終了します-

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

以下のようなスクリプトから呼び出された場合-

use T;
function();

次の結果が得られます-

Error in module! at test.pl line 4

コイと同様に、警告およびダイ機能に従って行およびファイル情報を含めることに関して、同じ基本ルールが適用されます。

告白機能

ザ・ confess 機能は次のようなものです cluck; dieを呼び出してから、発信スクリプトまでのスタックトレースを出力します。

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

以下のようなスクリプトから呼び出された場合-

use T;
function();

次の結果が得られます-

Error in module! at T.pm line 9
   T::function() called at test.pl line 4