【问题标题】:Why throws 'Caught Exceptionn' instead of 'Caught MyExceptionn' although I have the construct of the class?尽管我有类的构造,为什么要抛出“Caught Exception”而不是“Caught Exception”?
【发布时间】:2014-03-24 12:13:23
【问题描述】:

我有这个代码:

class MyException extends Exception {}

function __construct($palabra){
echo 'hola.adios';
}

try {
throw new MyException('Oops!');
}catch (Exception $e) {
echo "Caught Exceptionn";
}catch (MyException $e) {
echo "Caught MyExceptionn";
}

当我在资源管理器中运行它时,输出是“Caught Exceptionn”而不是“Caught MyExceptionn”,尽管它是一个新的 MyException 并且我已经在这个类中构造了!!

【问题讨论】:

    标签: php exception throw construct


    【解决方案1】:

    您的第一个catchblock 引用了异常,它是MyException 的父类。这意味着,如果您有 catch(Exception),它还将处理所有 MyException 和所有 Exception 类。

    颠倒您的顺序以解决您的问题(即,使其从最具体到最通用):

    class MyException extends Exception {}
    
    function __construct($palabra){
    echo 'hola.adios';
    }
    
    try {
    throw new MyException('Oops!');
    }catch (MyException $e) {
       echo "Caught MyExceptionn";
    }catch (Exception $e) {
       echo "Caught Exceptionn";
    }
    

    【讨论】:

      【解决方案2】:

      您应该将catch 块从最具体到最少链接起来。所以基本上,它应该看起来像

      class MyException extends Exception {}
      
      function __construct($palabra){
          echo 'hola.adios';
      }
      
      try {
          throw new MyException('Oops!');
      } catch (MyException $e) {
          echo "Caught MyException";
      } catch (Exception $e) {
          echo "Caught Exception";
      }
      

      如果异常是 MyException 类型,它将是第一个 catch 块中的 catched,如果不是,它将被更一般的 Exception catch 块捕获。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2019-09-05
        • 2012-06-12
        • 2015-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多