您的位置:首页 > 编程语言 > PHP开发

php错误及异常

2016-02-19 20:46 609 查看
写在前面的话:貌似所有语言的学习都是这么个顺序

错误报告及设置级别

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: