Perlエラー処理


プログラムの実行中は、存在しないファイルを開くなどのさまざまなエラーが常に発生します。

プログラムの実行中にエラーが発生した場合、エラーを回避し、プログラムが終了しないようにするために、いくつかの検出方法を使用する必要があります。

Perl にはエラーを処理するためのメソッドが複数用意されており、次にそれらを 1 つずつ紹介します。


if ステートメント

if ステートメント は、ステートメントの戻り値を決定できます。 例は次のとおりです。

if(open(DATA, $file)){
   ...
}else{
   die "Error: 无法打开文件 - $!";
}

プログラム内の変数 $! がエラー メッセージを返しました。 上記のコードを次のコードに単純化することもできます。

open(DATA, $file) || die "Error: 无法打开文件 - $!";

unless function

unless 関数は if の逆で、以下に示すように、式が false を返した場合にのみ実行されます。

ステートメントは次のとおりです。 これは、エラーのリマインダーを設定したい場合に非常に便利です。上記のコードは次のように省略することもできます:

unless(chdir("/etc")){
   die "Error: 无法打开目录 - $!";
}
上記のエラー メッセージは、ディレクトリ切り替えでエラーが発生した場合にのみ出力されます。

三項演算子


以下は三項演算子の簡単な例です:

die "Error: 无法打开目录!: $!" unless(chdir("/etc"));

上の例では、ハッシュ値が存在するかどうかを判断するために三項演算子を使用しました。

インスタンスには 2 つの値を持つ式が含まれており、形式は次のとおりです:

式 ? 値 1 : 値 2

warn 関数


warn 関数は、警告メッセージをトリガーするために使用されます。他の操作はありません。これは、通常、ユーザーにプロンプ​​トを表示するために使用されます:

print(exists($hash{value}) ? '存在' : '不存在',"\n");

die 関数。


die 関数は warn に似ていますが、終了します。一般的に使用されるエラー メッセージ出力:

chdir('/etc') or warn "无法切换目录";

Carp モジュール


Perl スクリプトでエラーを報告する一般的な方法は、warn() または die() 関数を使用してエラーを報告または生成することです。 Carp モジュールの場合、特にモジュール内で生成されるメッセージに対する追加レベルの制御が提供されます。

標準の Carp モジュールは、warn() 関数と die() 関数の代替手段を提供しており、エラーの場所を提供する際に、より有益でわかりやすいものです。モジュール内で使用すると、モジュール名と行番号がエラー メッセージに含まれます。

carp関数

carp関数はwarn関数と同様にプログラムの追跡情報を出力でき、通常はこの情報をSTDERRに送信します:

chdir('/etc') or die "无法切换目录";

スクリプト内で次のプログラムを呼び出します:

package T;

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

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

上記のプログラムを実行します。出力結果は次のようになります。

use T;
function();

cluck 関数

cluck() は warn() に似ており、エラーが発生した場所からのスタック トレースバックを提供します。

Error in module! at test.pl line 4

スクリプト内で次のプログラムを呼び出します:

package T;

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

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

上記のプログラムを実行すると、出力結果は次のようになります:

use T;
function();

croak関数

croak()はスクリプトを終了できるdie()と同じです。

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

スクリプト内で次のプログラムを呼び出します:

package T;

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

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

上記のプログラムを実行すると、出力結果は次のようになります:

use T;
function();

confess 関数

confess() は die() に似ていますが、エラーが発生した場所からのスタック トレースバックを提供します。発生した。

Error in module! at test.pl line 4

スクリプト内で次のプログラムを呼び出します:

package T;

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

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

上記のプログラムを実行すると、出力結果は次のようになります:

use T;
function();