许多地方,比如sql查询语句写错了,引擎只产生一个 warning, 我认为应该抛出异常更合适,这个怎么实现?

解决方案 »

  1.   

    <?php
    try {
        $o = new TestException(TestException::THROW_CUSTOM);
    } catch (MyException $e) {      // 捕获异常
        echo "Caught my exception\n", $e;
        $e->customFunction();
    } catch (Exception $e) {        // 被忽略
        echo "Caught Default Exception\n", $e;
    }?>
      

  2.   

    还是我自问自答吧,function my_warning_handler($errno, $errstr){
    throw new Exception($errstr,$errno);
    }
    set_error_handler("my_warning_handler", E_WARNING);
    这样就可以了,需要的人可以借鉴一下
      

  3.   

    不用那么hack吧?要我的话就这样:$res=mysql_query(...);if(!$res)
        throw MySQLException(); 
      

  4.   

    楼上的方法不够方便, 再说warning不止是数据库操作时才有, 逐一判断是非常的不爽
      

  5.   


    你也这不大可行呀。如果查询结果是error不是warning呢
      

  6.   

    以下文章为本人搜索网上的资源然后做的总结,代码经过验证,保证有效。
    1.error_reporting();设定错误等级
    等级如下
    1 E_ERROR php运行中的致命错误,会终止程序的运行。 
    2 E_WARNING php运行中的非致命错误,不会终止程序的运行。 
    4 E_PARSE 编译过程中解析器汇报的错误,比如你忘记了语句后面的“;”。 
    8 E_NOTICE php运行中的重要建议,最好有所改进的地方。 
    16 E_CORE_ERROR php核心产生的致命错误。 
    32 E_CORE_WARNING php核心产生的非致命错误。 
    64 E_COMPILE_ERROR Zend引擎引起的编译致命错误。 
    128 E_COMPILE_WARNING Zend引擎引起的编译致命错误。 
    256 E_USER_ERROR 使用trigger_error()函数抛出的致命错误,会终止程序的运行。 
    512 E_USER_WARNING 使用trigger_error()函数抛出的非致命错误,不会终止程序的运行。 
    1024 E_USER_NOTICE 使用trigger_error()函数抛出的并不严重的错误。 
    6143 E_ALL 在PHP 5.2之前表示除了E_STRICT之外的所有错误。6以后表示所有错误。 
    2048 E_STRICT php运行中的细节建议,往往是为了更好的向后兼容。 
    4096 E_RECOVERABLE_ERRO 接近致命的运行时错误,若未被捕获则视同E_ERROR 如果设置了等级,那么在等级范围内的就都可以抛出异常,要在可能出现错误的语句之前设定error_reporting();否则不管用例:<?php
      error_reporting(0);  //不显示任何错误(如果接下来出现了任何一种错误,也不会显示在浏览器页面上)
      error_reporting(E_ALL ^ E_NOTICE);  //表示在E_ALL级别中排除E_NOTICE的错误信息
    ?>但是,简单的将错误屏蔽,管理员无法获得错误信息,也就无法修改这些BUG,也就无法进行完善网站的工作,这是就需要自定义一个错误处理函数,即使在浏览器上屏蔽掉了错误,也要将错误保留下来,供管理员参考。如何实现见下文。2.自定义错误处理函数
     set_error_handler(): 设置自定义错误处理函数,设定之后,当遇到错误时,PHP错误处理方式被该函数替代。详细说明见下
     mixed set_error_handler ( callback error_handler [, int error_types] )
     参数
     error_handler:自定义函数名称,自定义函数格式如下:
      handler ( int errno, string errstr [, string errfile [, int errline [, array errcontext]]] )
      errno:错误号码
      errstr:错误提示信息
      errfile:发生错误的脚本路径
      errline:错误在脚本的行数
      errcontext:它包含了当前变量状态的快照。包括对管理员有用的上下文信息,有利于减少调试时间
     error_types:设置错误级别,不符合级别的将不会被自定义处理函数处理。
     注意:
     1.E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的(即使设置error_types), 也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错,在通常情况下不会发生。
     2.error_reporting()对于本函数不起作用,就算error_reporting(0),当出现第一点描述的错误之外的其他错误时,PHP也会调用自定义函数。
     例:这只是一个最简单的例子
     <?php
      function CustomError($strCode, $strMsg, $strFile, $strLine, $strContext)
      {
       $strError = '';
       $strError .='错误代码:' . $strCode . "\n";
       $strError .='错误消息:' . $strMsg . "\n";
       $strError .='脚本路径:' . $strFile . "\n";
       $strError .='错误行数:' . $strLine . "\n";
       $strError .='context:' . $strContext . "\n";
       echo $strError;    //也可以将错误发送到管理员的邮箱,然后跳转到指定的错误页面,就更完善了
       //如何发送邮件,请LZ自己查吧。
      }  set_error_handler("CustomError");
      //... ...
      //... ...
      //从设置了set_error_handler()开始,以后的这些代码一旦发生了错误就会调用自定义错误处理函数
     ?>
      

  7.   

    14楼跟我说的是一致的,为什么要抛出warning?   比较一些其它语言的做法就知道了, 比如sql写错了,我觉得就应该做为异常处理