プログラムの実行中、存在しないファイルを開くなど、さまざまなエラーが常に発生します。
プログラムの実行中にエラーが発生した場合、プログラムは停止します。エラーを回避し、プログラムが終了しないようにするには、いくつかの検出方法を使用する必要があります。
Perl にはエラーを処理するための複数のメソッドが用意されており、次にそれらを 1 つずつ紹介します。
if ステートメントはステートメントの戻り値を決定できます。例は次のとおりです。
if(open(DATA, $file)){ ...}else{ die "エラー: ファイルを開けません - $!";}
プログラム内の変数 $! がエラー メッセージを返しました。 上記のコードを次のコードに単純化することもできます。
open(DATA, $file) || die "エラー: ファイルを開けません - $!";
以下に示すように、 Unless関数は if の逆で、式が false を返した場合にのみ実行されます。
until(chdir("/etc")){ die "エラー: ディレクトリを開けません - $!";}
エラー通知を設定する場合は、 Unlessステートメントが非常に便利です。上記のコードは次のように省略することもできます。
die "エラー: ディレクトリを開けません!: $!"
上記エラーメッセージは、ディレクトリ切り替え時にエラーが発生した場合にのみ出力されます。
以下は三項演算子の簡単な例です。
print(exists($hash{value}) ? '存在します' : '存在しません',"n");
上の例では、三項演算子を使用してハッシュ値が存在するかどうかを判断しました。
この例には、式?値 1: 値 2 の形式で 2 つの値を含む式が含まれています。
warn 関数は、警告メッセージをトリガーするために使用されます。他の操作は実行されません。通常、ユーザーに次のプロンプトを表示するために使用されます。
chdir('/etc') または警告「ディレクトリを切り替えられません」;
die 関数は warn に似ていますが、終了します。通常、エラー メッセージの出力として使用されます。
chdir('/etc') または die "ディレクトリを切り替えることができません";
Perl スクリプトでエラーを報告する一般的な方法は、warn() 関数または die() 関数を使用してエラーを報告または生成することです。 Carp モジュールの場合、特にモジュール内で生成されるメッセージに対する追加レベルの制御を提供できます。
標準の Carp モジュールは、エラーの位置を特定する際に、より有益でユーザーフレンドリーな warn() および die() 関数の代替手段を提供します。モジュール内で使用すると、モジュール名と行番号がエラー メッセージに含まれます。
carp 関数は、warn 関数と同様に、プログラムのトレース情報を出力でき、通常はこの情報を STDERR に送信します。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { carp "モジュールのエラー!";}1;
スクリプト内で次のプログラムを呼び出します。
T;function(); を使用します。
上記のプログラムを実行すると、出力結果は次のようになります。
test.pl 行 4 でモジュールにエラーがあります!
cluck() は warn() に似ており、エラーが発生した場所からのスタック トレースバックを提供します。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp qw(cluck);sub function { cluck "モジュールのエラー!";}1;
スクリプト内で次のプログラムを呼び出します。
T;function(); を使用します。
上記のプログラムを実行すると、出力結果は次のようになります。
T.pm 9 行目でモジュールにエラーがあります。test.pl 4 行目で呼び出された T::function()
croak() は、die() と同様に、スクリプトを終了します。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { croak "モジュールのエラー!";}1;
スクリプト内で次のプログラムを呼び出します。
T;function(); を使用します。
上記のプログラムを実行すると、出力結果は次のようになります。
test.pl 行 4 でモジュールにエラーがあります!
believe() は die() に似ていますが、エラーが発生した場所からのスタック トレースバックを提供します。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function {「モジュールのエラー!」を告白;}1;
スクリプト内で次のプログラムを呼び出します。
T;function(); を使用します。
上記のプログラムを実行すると、出力結果は次のようになります。
T.pm 9 行目でモジュールにエラーがあります。test.pl 4 行目で呼び出された T::function()