【问题标题】:Ensuring all exceptions are considered when using PHP确保在使用 PHP 时考虑所有异常
【发布时间】:2009-05-26 22:39:46
【问题描述】:

我在 Java 中使用过异常,并且喜欢它不会让您调用方法的方式,除非您捕获或抛出它可能抛出的异常。

我在 PHP 中寻找类似的东西。我意识到 PHP 比 Java 更动态,甚至不允许你定义它抛出的异常,但是我能得到的最接近的是什么?

我们使用 PHP Doc 记录我们的方法,因此如果您在没有正确的 try/catch 块的情况下调用方法,或者在没有正确的 @thows 注释的情况下引发异常,那么触发 E_WARNING 的东西将是完美的。

【问题讨论】:

  • 有趣的问题,但恐怕我没有解决方案。
  • 你运气不好。我什至想不出一个丑陋的方式来模仿它......
  • 感谢大家的好回答。看起来某种形式的脚本在源代码上运行(编译器、静态分析工具等)是唯一的选择。耻辱。

标签: php exception-handling


【解决方案1】:

PHP 本身无法做到这一点。您将不得不解析 PHP 并自己弄清楚。尝试为此写phc plugin

【讨论】:

    【解决方案2】:

    我认为您根本无法合理地接近,因为语言核心没有提供任何东西供您使用。充其量,您最终会创建某种完全用户空间的函数调用/异常验证机制,这将对性能产生绝对可怕的影响。

    【讨论】:

      【解决方案3】:

      我不确定您能否实现既定目标。 PHP 环境不会分析函数可能会或可能不会做什么,这通常是其他语言的编译时操作(我认为)。我认为您甚至无法通过反射找到那种东西。

      但是当你说你不能定义抛出的异常时你错了,因为异常基类是fully extendable。 PHP默认不会抛出任何异常,它会触发错误。触发错误和异常之间存在根本区别,后者在很大程度上是用户级构造。

      这不是你的问题,但我建议如果你想迁移到完全面向异常的环境,你可以使用set_error_handler() 编写自己的错误处理程序并管理 PHP 触发的错误,并让它抛出一个异常。

      【讨论】:

      • > 你错了,但是当你说你不能定义抛出的异常时,我的意思是如果不查看方法就无法知道方法可能抛出哪些异常资源。我所说的 java 等价物是: public void myMethod() throws MyException { ... } 我能得到的最接近的是 PHP Doc,PHP 本身会忽略它。
      • 啊,是的,我原来误会你了。是的,我想你可能不走运。 PHP 语言在构建时并未考虑到异常处理。
      【解决方案4】:

      我认为您可以使用异常处理程序和反射在 PHP 中简单地重现此行为。

      class YourException extends Exception {
        public function __toString() {
          return __CLASS__;
        }
      }
      
      class MyObject {
          public function __construct(){}
          /**
          * @throws MyException
          */
          public function myMethod() {
              return 'foo';
          }
      }
      
      try {
          $o = new MyObject();
          $o->myMethod();
      } 
      catch(YourException $e) {
          $method = new ReflectionMethod('MyObject', 'myMethod');
          $method->getDocComment();
      
          $throws = // Get the @throws comment (foreach, regexp, whatever);
          if($e === $throws) {
              // do something
          }
      }
      

      Setting your own exception handler.

      Grab and analyse the comments with Reflection mechanism (see getDocComment)

      【讨论】:

      • 只有在实际抛出异常时才有效。由于相对很少抛出异常,我一直在寻找能够提醒我注意潜在未捕获异常的东西,即使它实际上并没有在运行时抛出。
      猜你喜欢
      • 2019-11-16
      • 2012-01-17
      • 2015-01-14
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多