warning 可以改成抛出异常么

madpc 2009-06-25 01:50:48
许多地方,比如sql查询语句写错了,引擎只产生一个 warning, 我认为应该抛出异常更合适,这个怎么实现?
...全文
94 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenyao 2009-07-14
  • 打赏
  • 举报
回复
关注!
madpc 2009-07-13
  • 打赏
  • 举报
回复
14楼跟我说的是一致的,为什么要抛出warning? 比较一些其它语言的做法就知道了, 比如sql写错了,我觉得就应该做为异常处理
wfnychuan 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 TR@SOE 的回复:]
不用那么hack吧?

要我的话就这样:PHP code$res=mysql_query(...);
if(!$res)
throwMySQLException();
[/Quote]

你也这不大可行呀。如果查询结果是error不是warning呢。。。
yctin 2009-07-03
  • 打赏
  • 举报
回复
... d(-_-)b ...
madpc 2009-07-03
  • 打赏
  • 举报
回复
楼上的方法不够方便, 再说warning不止是数据库操作时才有, 逐一判断是非常的不爽
zkluninfo 2009-07-03
  • 打赏
  • 举报
回复
来看下
xiangzilhx 2009-07-03
  • 打赏
  • 举报
回复
以下文章为本人搜索网上的资源然后做的总结,代码经过验证,保证有效。
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()开始,以后的这些代码一旦发生了错误就会调用自定义错误处理函数
 ?>

TR@SOE 2009-06-26
  • 打赏
  • 举报
回复
不用那么hack吧?

要我的话就这样:


$res=mysql_query(...);

if(!$res)
throw MySQLException();
jlzan1314 2009-06-26
  • 打赏
  • 举报
回复
佩服楼主!
fxs_2008 2009-06-26
  • 打赏
  • 举报
回复
学习
总哈哈 2009-06-26
  • 打赏
  • 举报
回复
学习,呵呵
xiangzilhx 2009-06-26
  • 打赏
  • 举报
回复
6L头像,(¯﹃¯)口水
岑子哥 2009-06-25
  • 打赏
  • 举报
回复
不错,学习了!
madpc 2009-06-25
  • 打赏
  • 举报
回复
还是我自问自答吧,

function my_warning_handler($errno, $errstr){
throw new Exception($errstr,$errno);
}
set_error_handler("my_warning_handler", E_WARNING);


这样就可以了,需要的人可以借鉴一下
madpc 2009-06-25
  • 打赏
  • 举报
回复
没有人知道?
岑子哥 2009-06-25
  • 打赏
  • 举报
回复
我理解错误了!
madpc 2009-06-25
  • 打赏
  • 举报
回复
楼上说的是自定义异常, 跟我说的问题不相干
岑子哥 2009-06-25
  • 打赏
  • 举报
回复
<?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;
}

?>

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧