写在前面的话:貌似所有语言的学习都是这么个顺序
可以修改配置文件:error_reporting的common values后面加一行error_reporting=E_ALL & ~E_NOTICE
或者在程序里面加error_reporting()括号里面加下面的内容
display_errors: 是否开启PHP输出错误报告的功能
值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)
在PHP脚本中可调用ini_set( )函数,动态设置php.ini配置文件.
如:ini_set("display_errors","On"); //显示所有错误信息
error_reporting: 设置不同的错误报告级别。
error_reporting = E_ALL & ~E_NOTICE
-- 可以抛出任何非注意的错误,默认值
error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
-- 只考虑致命的运行时错误、新解析错误和核心错误。
error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
-- 报告除用户导致的错误之外的所有错误。
在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);
自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置(我不希望破坏页面的布局),以下几种情况可以考虑自定义错误处理。
可以记下错误的信息,及时发现一些生产环境出现的问题
可以屏蔽错误。
可以控制错误的输出。
可以作为调试工具。
使用set_error_handler()函数来设置用户自定义错误处理。
<?php error_reporting(E_ALL & ~E_NOTICE); set_error_handler("myerror"); $mess=""; function myerror() { global $mess; $error_type="1"; $error_message="this is a error"; $error_file="test1.php"; $error_line="12"; $mess.="发生错误的级别为{$error_type},错误消息{$error_message},在文件{$error_file},第{$error_line}行"; } gettype($a); echo "1111111111"; gettype(); echo "22222222"; //gettype3(); echo "___________________"; echo $mess;
111111111122222222___________________发生错误的级别为1,错误消息this is a error,在文件test1.php,第12行发生错误的级别为1,错误消息this is a error,在文件test1.php,第12行
1、先配置php.ini:
error_reporting = E_ALL//将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_log=1024// 每个日志项的最大长度
error_log=G:/myerror.log //指定错误写进的文件
2、使用函数:在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中
如:error_log("登录失败了!");
<?php gettype($a); echo "1111111111"; gettype(); echo "22222222"; //gettype3(); error_log("error!!!"); echo "___________________";
修改完error_log = syslog取消注释,那么在系统文件中可以查看错误信息:系统日志
如windows系统,通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。
但是最好是定义自己的文件 error_log = "c:/wamp/logs/phperror.log" 我们最好不写在服务器里,容易被黑客攻击
我们在配置文件中更改的东西,在文件中都可以改ini_set()设置,ini_get()获取
异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程。是PHP5中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。
异常的意义在于解决问题,而不仅仅在于提示信息。php里面用的没有java多,重点了解的东西就好。面向对象的语言里面都有吼吼吼~
异常处理格式:
try{
使用try去包含可能会发生异常的代码.
一旦出现异常try进行捕获异常,交给catch处理。
抛出异常语句:throw 异常对象。
}catch(异常对象参数){
在这里做异常处理。
}[catch(。,,){
.. .. ..
}]
* 1. try catch是一体
* 2. try catch之间不能有任何代码
*
* 工作原理
*
* 1. 试着执行try中的代码, 如果没有问题, 继续执行catch之后的代码
*
* 2. Exception 是系统的类
*
* 3. 如果有异常对象抛出, 就将异常对象给 catch()中的类
*
* 4. try中发生异常位置后的代码不再执行, 而是直接到catch中, catch中执行完成以后, 再继续执行catch之后的代码
我的栗子真是萌萌哒
<?php echo "早起<br>"; try{ echo "去实验室<br>"; //抛出异常 throw new Exception("忘带钥匙了QAQ<br>"); echo "带钥匙了<br>"; } catch(Exception $e) { echo $e->getMessage(); echo "等人来开门<br>"; } echo "刷题吼吼吼<br>";早起
但是哟,意外是怎么发生的哦,总不能每次早起都忘带钥匙吧,粗狂的用if判断,能不能系统自动处理啊
<?php set_error_handler("myerror"); function myerror($type,$mess,$file,$line) { if($type==E_WARNING) throw new Exception("粗线意外".$mess); } function start($d) { echo $d."<br>"; } echo "早起<br>"; try{ echo "去实验室<br>"; //抛出异常 start (); echo "带钥匙了<br>"; } catch(Exception $e) { echo $e->getMessage(); echo "等人来开门<br>"; } echo "刷题吼吼吼<br>";
这个方法我喜欢,之前自己写函数名字写错了,本来应该报错,没报错,发现是自己display_errors=Off 忘改回来了,改成On就好啦
<?php class MyException extends Exception//写出对应的异常解决方法 { function __construct($mess) { //必须先调用父类的,有初始化的 parent::__construct($mess); } function wait() { echo "等人来开门<br>"; } } echo "早起<br>"; try{ echo "去实验室<br>"; //抛出异常 throw new MyException("忘带钥匙了"); echo "带钥匙了<br>"; } catch(Exception $e) { echo $e->getMessage(); $e->wait(); } echo "刷题吼吼吼<br>";
在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。
<?php class MyException extends Exception//写出对应的异常解决方法 { function __construct($mess) { //必须先调用父类的,有初始化的 parent::__construct($mess); } function wait() { echo "等人来开门<br>"; } } class MyException1 extends Exception//写出对应的异常解决方法 { function wait() { echo "等人来开门<br>"; } } class MyException2 extends Exception//写出对应的异常解决方法 { function wait() { echo "去图书馆<br>"; } } class MyException3 extends Exception//写出对应的异常解决方法 { function wait() { echo "手机连网<br>"; } } class MyException4 extends Exception//写出对应的异常解决方法 { function wait() { echo "室友代签到<br>"; } } class unluckydog{ function forgetkey($flag) { if(!$flag)throw new MyException1("忘带钥匙了"); echo "带了<br>"; } function noelectric($flag) { if(!$flag)throw new MyException2("实验室没电"); echo "有电<br>"; } function noweb($flag) { if(!$flag)throw new MyException3("实验室没网"); echo "有网<br>"; } function check($flag) { if(!$flag)throw new MyException4("老师点名了"); echo "没点名<br>"; } } echo "早起<br>"; try{ echo "去实验室<br>"; //抛出异常 //忘带钥匙了 //实验室没电->去图书馆 //实验室没网->用手机连网 //老师点名了->室友代签到 $myday=new unluckydog(); $myday->forgetkey(true); $myday->noelectric(true); $myday->noweb(false); $myday->check(true); } catch(MyException1 $e) { echo $e->getMessage(); $e->wait(); } catch(MyException2 $e) { echo $e->getMessage(); $e->wait(); } catch(MyException4 $e) { echo $e->getMessage(); $e->wait(); } catch(Exception $e) { echo $e->getMessage(); //$e->wait(); } echo "刷题吼吼吼<br>";
我这个栗子简直绝了==
catch里面还可以嵌套try catch