将PHP错误处理程序限制为特定的命名空间

时间:2011-04-21 19:29:33

标签: php namespaces error-handling

PHP中是否有任何方法只为特定的命名空间设置错误处理程序?我正在构建一个小框架,我希望能够通过设置自定义错误处理程序并使用它抛出异常来尝试捕获其命名空间中的所有错误/警告/通知消息。 在此特定命名空间外触发的错误应以常规方式运行。

可以用PHP完成吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

提前道歉,因为在发布之前没有真正尝试过这个:

PHP传递给错误处理程序方法的第五个(可选)参数(通常被忽略)是一个数组$ errcontext,它指向当前的PHP符号表。我的想法是,如果您可以从Rudie提出的Exception的回溯中提取命名空间,那么也可以从$ errcontext以类似的方式提取命名空间信息。如果这是真的那么你的错误处理程序可以检查它自己的命名空间,如果当前命名空间与设计错误处理程序的命名空间不匹配,则返回false。

此外,错误处理程序可以“堆叠”,这意味着至少在原则上(如果我的建议“挖掘”$ errcontext实际上有效),您可以为每个命名空间设置单独的错误处理程序。

我并没有声称这种方法比Josh和Rudie提出的解决方案更“优雅”,但它似乎与你想要做的事情一致 - 这就是强加一种错误处理程序的作用域约束。

祝你好运!

答案 1 :(得分:1)

我之前没有尝试这样做,所以如果这不起作用我会提前道歉(至少它可能会让你思考),但这就是我试图实现这个目标的方法:

由于你的命名空间将是一个整体更大的框架的一部分,我会让框架中的所有类扩展一个基类(为此我们称之为BaseClass)。在该类中,我将创建一个名为errorHandler()的方法。在这个函数中,你可以为你的异常处理做任何你想做的事情(甚至可能自己抛出异常)。

现在您已拥有此功能,我们必须弄清楚如何调用此函数。由于命名空间中的所有对象都扩展了BaseClass,因此它们都可以访问此errorHandler()方法。现在在代码中你可以使用普通的try / catch块来捕获发生的异常而不是使用标准异常模型,而是调用$ this-> errorHander()(现在我想到你可能想要在这里放置一些参数 - 可能是你从catch语句得到的异常)。这应该为您提供您希望发生问题的代码部分所需的内容。

我们需要弄清楚的下一部分是处理您不期望的异常以及您计划如何通过此错误处理程序路由这些异常。这个有点棘手,因为这个解决方案依赖于某个地方的try / catch块。由于这是一个框架,我将假设所有内容都通过index.php或其他一些引导程序文件(类似Zend Framework等)运行。如果是这种情况,那么我会把你的try / catch放在框架开始的任何地方。根据您在catch块中获得的异常,您可以决定是否要通过errorHandler()方法运行它。我必须管理这个部分,不知怎的感觉有点脏,应该有更好的方法来做到这一点(也许一旦你走得更远,一个更好的解决方案就会出现)。

希望这有助于您在流程中走得更远。如果有人知道如何让最后一部分感觉不那么脏,那就太好了。

答案 2 :(得分:0)

  

可以用PHP完成吗?

我可以说很容易做到。如果没有实际编写代码,这就是我要做的事情:

  1. 创建一个try / catch块
  2. 抓住所有例外情况(\Exception
  3. 查找最后一个被调用的类($exception->getTrace()中的某个地方)
  4. 该类的名称空间名称为some\name\space\Class
  5. 使用dirname($namespace)删除班级名称(在这种情况下为"Class"
  6. 根据结果做任何你喜欢的事情或重新抛出例外:throw $exception;
  7. 修改
    甚至闭包都有名称空间:

    namespace oele\boele;
    
    $fn = function() {
      throw new \Exception;
    };
    
    try {
      $fn();
    }
    catch ( \Exception $ex ) {
      print_r($ex);
    }
    

    $ex->getTrace()[0]['function']将为oele\boele\{closure}

    修改
    太糟糕了trace数组没有每个元素的键'namespace'