warning 可以改成抛出异常么 许多地方,比如sql查询语句写错了,引擎只产生一个 warning, 我认为应该抛出异常更合适,这个怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?phptry { $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;}?> 还是我自问自答吧,function my_warning_handler($errno, $errstr){ throw new Exception($errstr,$errno);}set_error_handler("my_warning_handler", E_WARNING);这样就可以了,需要的人可以借鉴一下 不用那么hack吧?要我的话就这样:$res=mysql_query(...);if(!$res) throw MySQLException(); 楼上的方法不够方便, 再说warning不止是数据库操作时才有, 逐一判断是非常的不爽 你也这不大可行呀。如果查询结果是error不是warning呢 以下文章为本人搜索网上的资源然后做的总结,代码经过验证,保证有效。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()开始,以后的这些代码一旦发生了错误就会调用自定义错误处理函数 ?> 14楼跟我说的是一致的,为什么要抛出warning? 比较一些其它语言的做法就知道了, 比如sql写错了,我觉得就应该做为异常处理 用php的curl模拟登录一个网站 sql的多筆資料怎發出email 当一个php运行完之后,哪些变量的值,在下次运行仍然可以用? checkbox按纽控制的问题, 怎么用一条语句列出MYSQL的所有常量? linux下用什么语言和工具做网站最好? 烂问题:Unable to read *** bytes in /home/test.php 为什么我用PHPH连ORACLE的速度这么慢,望大虾释疑! foreach循环中,这样的变化如何写 ajax调用php后,页面刷新但让php继续执行 100分请教高手抓取一网页的源码问题。 求助:C#代码转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;
}?>
throw new Exception($errstr,$errno);
}
set_error_handler("my_warning_handler", E_WARNING);
这样就可以了,需要的人可以借鉴一下
throw MySQLException();
你也这不大可行呀。如果查询结果是error不是warning呢
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()开始,以后的这些代码一旦发生了错误就会调用自定义错误处理函数
?>