写在前面的话:貌似所有语言的学习都是这么个顺序
错误报告及设置级别
PHP的错误报错级别
调整错误报告级别
可以修改配置文件: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的错误报告处理方式
自定义错误报告的处理方式,可以完全绕过标准的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 "___________________";
错误默认写在apache的错误日志里,用服务器访问程序错误。apache error log里面哟
修改完error_log = syslog取消注释,那么在系统文件中可以查看错误信息:系统日志
如windows系统,通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。
但是最好是定义自己的文件 error_log = "c:/wamp/logs/phperror.log" 我们最好不写在服务器里,容易被黑客攻击
我们在配置文件中更改的东西,在文件中都可以改ini_set()设置,ini_get()获取
什么是PHP的异常处理
异常(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>";
早起 去实验室
忘带钥匙了QAQ
等人来开门
刷题吼吼吼
但是哟,意外是怎么发生的哦,总不能每次早起都忘带钥匙吧,粗狂的用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>";
早起
去实验室
粗线意外Missing argument 1 for start(), called in C:\wamp\www\error\test3.php on line 15 and defined等人来开门
刷题吼吼吼
这个方法我喜欢,之前自己写函数名字写错了,本来应该报错,没报错,发现是自己display_errors=Off 忘改回来了,改成On就好啦
自定义异常
自己定义异常类必须是系统异常Exception的子类!
<?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