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.
    }
  }
?>

当然,一种解决方案是$genericInfo作为参数或全局变量传递给SpecificAndEncapsulated::justdomyjoberror_handler 并让 error_handler 处理问题而不会引发任何异常。然而,这种解决方案并不自然。还有其他方法可以系统地将变量传递$genericInfoSpecificAndEncapsulated,但问题是一样的。没有必要系统地传递 $genericInfo 值,因为它不是应该关注的事情,SpecificAndEncapsulated即使发生异常也不应该,更不用说在每次调用时都系统地传递。在上级管理通知后,向异常发出者回复说“谢谢,现在继续”的通信是很自然的。是否支持这种类型的 E_NOTICE 或 E_USER_NOTICE 管理?

4

2 回答 2

0

按照设计,异常是指正常执行无法继续的错误。

在现实世界中,它会是这样的:警察(第三方)打电话给货运公司调度员(顶级代码)并说,“你的一辆卡车在火球中爆炸,司机在医院”(工作),调度员说“注意。我希望有效载荷按时到达。”

如果你想继续工作,你必须在工作中捕获异常。一种可行的方法是将错误处理函数或委托对象传递给作业。

于 2015-02-09T18:42:07.813 回答
0

PHP 5 具有类似于其他编程语言的异常模型。可以抛出异常,并在 PHP 中捕获(“捕获”)。代码可能会被包围在一个 try 块中,以便于捕获潜在的异常。每个尝试必须至少有一个对应的 catch 块。可以使用多个 catch 块来捕获不同类别的异常。正常执行(当在 try 块中没有抛出异常,或者当不存在与抛出的异常的类匹配的 catch 时)将在按顺序定义的最后一个 catch 块之后继续。可以在 catch 块内抛出(或重新抛出)异常。

当抛出异常时,语句后面的代码将不会被执行,PHP 将尝试找到第一个匹配的 catch 块。如果未捕获到异常,则会发出 PHP 致命错误,并带有“未捕获的异常 ...”消息,除非已使用 set_exception_handler() 定义了处理程序。

在 PHP 5.5 及更高版本中,也可以在 catch 块之后指定 finally 块。finally 块中的代码将始终在 try 和 catch 块之后执行,无论是否引发了异常,并且在正常执行恢复之前。

抛出的对象必须是 Exception 类的实例或 Exception 的子类。试图抛出一个不是的对象将导致 PHP 致命错误。

于 2015-02-09T18:45:21.503 回答