代码之家  ›  专栏  ›  技术社区  ›  thelem

确保在使用PHP时考虑所有异常

  •  4
  • thelem  · 技术社区  · 16 年前

    我在Java中使用了异常,就像它不会让你调用一个方法,除非你捕获或抛出它可能抛出的异常。

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

    我们使用php-doc记录我们的方法,因此,如果您调用的方法没有正确的try/catch块,或者抛出的异常没有正确的@thows注释,那么触发e_警告的东西将是完美的。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Kornel    16 年前

    在PHP本身中没有办法做到这一点。您必须解析PHP并自己解决它。尝试写作 phc plugin 为此。

        2
  •  1
  •   chaos    16 年前

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

        3
  •  1
  •   zombat    16 年前

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

    但是,当您说不能定义抛出的异常时,您是错的,因为异常基类是 fully extendable .尽管默认情况下PHP不会抛出任何异常,但它会触发错误。触发错误和异常之间存在着根本的区别,后者在很大程度上是一个用户-土地构造。

    这不是你的问题,但是我提出了一个建议,如果你想转移到一个完全面向异常的环境中,你可以用 set_error_handler() 并管理PHP触发的错误,并让它抛出异常。

        4
  •  1
  •   Christophe Eblé    16 年前

    我认为您可以使用异常处理程序和反射在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)