写在前面的话:貌似所有语言的学习都是这么个顺序

错误报告及设置级别

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