0

具体的に言うと、私が望んでいることは不可能であることがわかっているコードをいくつか提示します。私は同じものを得る別の方法を探しています。

<?php
  error_reporting(E_ALL | E_STRICT); 

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    // When $errno is a notice, we would like a way for the execution to continue here. Since it is only a notice, eventually it could go back to where the notice was triggered. 
  }

  set_error_handler("exception_error_handler");

  Class TopLevelManagement {
    private $genericInfo = "Very important to add in notices"; 

    function highleveljob() {
      try{
        // In practice, the following statements could occur below in the execution tree, after a few other function calls. 
        $specific = new SpecificAndEncapsulated();
        $specific->specificjob();
      }
      catch (ErrorException $e) {
        $message = $e->getMessage() . $this->genericInfo; 
        mail($admin_email, "Consider the generic info and recover from this situation", $message); 
        // Here we would like the execution to continue where the exception was thrown. In the real world, this would be like "thank you error handler for SpecificAndEncapsulated::specificjob, we have taken care of the issue with the help of our larger perspective.". 
      }   
    } 
  }

  Class SpecificAndEncapsulated {

    function specificjob() {
      // Some processing
      if($unexpected == true) trigger_error('Here is how little I know, as I should', E_USER_NOTICE);
      // Continue as expected after a notice.
    }
  }
?>

もちろん、1 つの解決策は$genericInfo、パラメーターまたはグローバル変数として渡してSpecificAndEncapsulated::justdomyjob、例外を発生させずに error_handler に問題を処理させることです。ただし、この解決策は自然ではありません。$genericInfo 変数をに体系的に渡す方法は他にもありますSpecificAndEncapsulatedが、問題は同じです。$genericInfo の値を体系的に渡す必要はありません。これはSpecificAndEncapsulated、例外が発生した場合でも関係するものではないためです。呼び出しのたびに体系的に渡す必要はありません。通知がより高いレベルで管理された後、「ありがとう、今続行します」という例外の発行者への連絡は自然なことです。このタイプの E_NOTICE または E_USER_NOTICE 管理のサポートはありますか?

4

2 に答える 2

0

設計上、例外はエラーであり、その後は通常の実行を続行できません。

現実の世界では、次のようになります: 警察官 (第三者) がトラック運送会社の配車係 (トップレベル コード) に電話をかけ、「あなたのトラックの 1 台が火の玉の中で爆発し、運転手は車内にいます」と言います。病院」(ジョブ)、ディスパッチャーは「注意してください。ペイロードが予定どおりに到着することを期待しています」と言います。

ジョブを続行するには、ジョブ内で例外をキャッチする必要があります。実行可能な方法の 1 つは、エラー ハンドラー関数またはデリゲート オブジェクトをジョブに渡すことです。

于 2015-02-09T18:42:07.813 に答える
0

PHP 5 には、他のプログラミング言語と同様の例外モデルがあります。例外は、PHP 内でスローおよびキャッチ (「キャッチ」) できます。潜在的な例外をキャッチしやすくするために、コードを try ブロックで囲むことができます。各試行には、少なくとも 1 つの対応する catch ブロックが必要です。複数の catch ブロックを使用して、さまざまなクラスの例外をキャッチできます。通常の実行 (try ブロック内で例外がスローされない場合、またはスローされた例外のクラスに一致する catch が存在しない場合) は、順番に定義された最後の catch ブロックの後に続行されます。例外は、catch ブロック内でスロー (または再スロー) できます。

例外がスローされると、ステートメントに続くコードは実行されず、PHP は最初に一致する catch ブロックを見つけようとします。例外がキャッチされない場合、ハンドラーが set_exception_handler() で定義されていない限り、"Uncaught Exception ..." メッセージとともに PHP Fatal Error が発行されます。

PHP 5.5 以降では、catch ブロックの後に finally ブロックを指定することもできます。finally ブロック内のコードは、例外がスローされたかどうかに関係なく、try ブロックと catch ブロックの後、通常の実行が再開される前に常に実行されます。

スローされるオブジェクトは、Exception クラスのインスタンスまたは Exception のサブクラスである必要があります。そうでないオブジェクトをスローしようとすると、PHP Fatal Error が発生します。

于 2015-02-09T18:45:21.503 に答える