Perl-error-handling

提供:Dev Guides
移動先:案内検索

Perl-エラー処理

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

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

さまざまな方法でエラーを識別してトラップできます。 Perlでエラーを簡単にトラップし、適切に処理します。 使用できる方法はいくつかあります。

ifステートメント

  • ifステートメント*は、ステートメントからの戻り値を確認する必要がある場合の明らかな選択肢です。例えば-
if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

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

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

except関数

*unless* 関数はif:と論理的に反対です。ステートメントは成功ステータスを完全にバイパスし、式がfalseを返す場合にのみ実行できます。 たとえば-
unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}
*unless* ステートメントは、式が失敗した場合にのみエラーまたは代替を発生させる場合に最適です。 ステートメントは、単一行のステートメントで使用する場合にも意味があります-
die "Error: Can't change directory!: $!" unless(chdir("/etc"));

ここでは、chdir操作が失敗し、うまく読み込めた場合にのみ死にます。

三項演算子

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

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

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

警告機能

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

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

ダイ機能

die関数は、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関数

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* 関数は、呼び出し元を1レベル上に報告することを除いて、 *die* と同等です。 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

carpと同様に、warnおよびdie機能に応じた行およびファイル情報の組み込みに関して、同じ基本規則が適用されます。

告白機能

*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