【 エラー処理 】

1. 概要
2. fopen 関数でのエラーメッセージの抑制

エラー処理に関する情報
  • 結論から言えば、標準化の責任者は以下のドキュメントを良く読む
    べきです。ほとんどの場合、PHPが適切な処置を行なってくれます
    が、E_WARNING の処理と、要求に対する処置の方法を知っておく
    べきです

  • 演算子 --> エラー制御演算子
  • エラー処理およびログ記録関数
  • error_reporting 関数
  • set_error_handler 関数


  • fopen 関数の振舞い
  • $ret = fopen( "file.txt", "r" ); の処理において、失敗すると
    FALSE が戻ります。しかし、通常では E_WARNING メッセー
    ジが出力されてしまって、プログラムの継続を妨げる事になり
    ます

  • このメッセージを抑制する方法はいくつかありますが、製品レ
    ベルにするには set_error_handler 関数の使用が最も適当で
    あると思われますが、開発中はかならずしもそうでないかもし
    れません


  • $ret = @fopen( "file.txt", "r" );
    if ( !$ret ) {
    	print "オープンに失敗しました<br>";
    }
    


  • @演算子を用いる方法は、エラーメッセージを抑制する最も簡単な方法ですが、この記述方法
    では、致命的なエラーさえも表示抑制され、どのような場合でも詳細情報を得る事ができません

  • また、ソースコード中に点在するこの状態をシステム全体でコントロールする事が不可能になり
    ます。簡単なテストに用いるのは良いでしょうが、メンテナンスの必要な製品で使う事は好ましく
    ありません


  • error_reporting( E_ALL ^ E_WARNING );
     
    $ret = fopen( "file.txt", "r" );
    if ( !$ret ) {
    	print "オープンに失敗しました<br>";
    }
    


  • error_reporting 関数を用いる方法は、この記述を共通関数で実行させるようにする事で、そ
    の部分さえ変更すれば、システム全体で同じ振舞いを実現する事ができます

  • # **********************************************************
    # エラーメッセージクラス
    # **********************************************************
    class ErrInfo {
    	var $No;
    	var $Message;
    	var $File;
    	var $Line;
    }
     
    $Err = new ErrInfo();
     
    # **********************************************************
    # ユーザエラーハンドラ
    # **********************************************************
    function MyErrorHandler( $errno, $errmsg, $file, $line ) {
     
    	global $Err;
     
    	$Err->No	= $errno;
    	$Err->Message	= $errmsg;
    	$Err->File	= $file;
    	$Err->Line	= $line;
     
    }
     
    # **********************************************************
    # ユーザエラーハンドラの登録
    # **********************************************************
    set_error_handler("MyErrorHandler");
     
    # **********************************************************
    # 処理
    # **********************************************************
    $ret = fopen( "file.txt", "r" );
    if ( !$ret ) {
    	print "オープンに失敗しました<br>";
    	print "{$Err->Message}<br>";
    	print "エラーが発生したのは{$Err->File}の{$Err->Line}行目です<br>";
    }
    
  • この方法では、set_error_handler 関数で、ユーザエラーハンドラを作成してエラー時の処理を具
    体的にメンテナンス可能になります。もちろんエラーの種類もユーザでカスタマイズ可能になるでし
    ょう

  • 但し、ユーザハンドラは全てのエラーを扱う事はできません。ターゲットは E_WARNING と考えて下
    さい