PHP基础之 错误处理 及 异常处理

错误处理:
1.使用die()方法,结束语句的执行,并输出错误消息
2.自定义错误和错误触发器

自定义错误处理函数(系统有默认的错误处理函数,自定义的错误处理会覆盖默认的处理函数)
======================================================================
error_function(error_level,error_message,error_file,error_line,error_context)
参数 描述
error_level 必需。为用户定义的错误规定错误报告级别。必须是一个值数。
error_message 必需。为用户定义的错误规定错误消息。
error_file 可选。规定错误在其中发生的文件名。
error_line 可选。规定错误发生的行号。
error_context 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

错误级别:
2         E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8         E_NOTICE Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
256         E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512         E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024     E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096     E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191     E_ALL 所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

错误触发器:trigger_error($errMsg,$errType)
===========================================
作用:用于指定自定义的错误消息
可能的错误类型$errType:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。


错误日志 error_log(error,[type],[destination],[headers])
========================================================
作用:用于将错误信息保存到指定文件或向远程目的地发送错误信息
参数 描述
error 必需。要记录的错误消息。
type 可选。规定错误记录的类型。

可能的记录类型:

0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。
1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。
2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。
3 - 错误发送到文件目标字符串。
 
destination 可选。规定向何处发送错误消息。该参数的值依赖于 "type" 参数的值。
headers 可选。只在 "type" 为 1 时使用。

规定附加的头部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。

注释:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置。
 

$test=2;

if ($test>1)
{
    error_log("A custom error has been triggered",1,"someone@example.com","From: webmaster@example.com");
}

PHP 异常处理
============
try{
    可能出现异常的代码块
}catch(Exception $e){
    处理异常/抛出异常
}

抛出一个异常:throw new Exception("异常信息");

Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

注意:
当出现异常后,则出现异常的代码之后的代码不再执行
使用多个catch可以捕获多种类型的异常信息
PHP5.0 以前的函数没有异常机制,无法捕获异常,只能使用错误处理机制处理

设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。

异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。

自定义异常类:class MyException1 extends Exception(){}

<?php
// die()函数:
// ===========
// 例:当打开一个文件,如果不存在,则终止语句执行,并输出消息,否则继续执行
// file_exists("1.txt") or die("打开文件出错或文件不存在");
// echo "继续文件打开工作";


//自定义错误处理函数
//==================
//
//参数:$errorCode:错误级别的值,$errorMsg:错误消息
// function WarningError($errorVal,$errorMsg,$fielName,$line,$arrVal)
// {
// 	echo("<p>第<b>".$line."</b>行发生错误:</p>");
// 	echo("<p style='color:red'>错误消息:$errorMsg</p>");
// }

// //注册自定义错误处理函数,对WARNING级别的错误进行处理
// set_error_handler("WarningError",E_WARNING);//第二个参数为可选错误级别,默认为E_ALL,即所有的错误

// $f = fopen("2.txt", "r");



//错误触发器:trigger_error($errMsg,$errType) 
//===========================================
//作用:用于指定自定义的错误消息
// 可能的错误类型$errType:
 
function WarningError($errorVal,$errorMsg,$fielName,$line,$arrVal)
{
	echo("<p>第<b>".$line."</b>行发生错误:</p>");
	echo("<p style='color:red'>错误消息:$errorMsg</p>");
}

function MainError($errorVal,$errorMsg,$fielName,$line,$arrVal)
{
	echo("<p>第<b>".$line."</b>行发生错误:</p>");
	echo("<p style='color:red'>错误消息:$errorMsg</p>");
}
//注册自定义错误处理函数,对E_USER_ERROR级别的错误进行处理
set_error_handler("MainError",E_USER_ERROR);
set_error_handler("WarningError",E_USER_WARNING);


//设置年龄,当年年龄的区间不在指定区间内时,触发自定义的错误消息
function SetAge($value=0)
{
	if($value<0)
	{
		trigger_error("输入年龄过小",E_USER_ERROR);
	}
	elseif ($value>=150) 
	{
		trigger_error("输入年龄过大");
	}
	elseif (!is_int($value)) {
		trigger_error("请输入正整数!",E_USER_WARNING);
	}

	echo("最后的代码执行了\n");
}


// SetAge(180);//由于没有给默认的错误触发器注册自定义的E_USER_NOTICE级别错误处理函数,所以结果是
// Notice: 输入年龄过大 in D:\PHPEnv\WWW\test001.php on line 77
// 最后的代码执行了

// SetAge(-10);
// 注册了E_USER_ERROR级别的错误处理函数后,输出结果为:
// 第73行发生错误:
// 错误消息:输入年龄过小
// 最后的代码执行了

// SetAge("aa");
// 
// 
// 
// 
// 错误日志 error_log(error,[type],[destination],[headers])
// ===================
// 作用:用于将错误信息保存到指定文件或向远程目的地发送错误信息
// 参数 描述 
// error 必需。要记录的错误消息。 
// type 可选。规定错误记录的类型。

// 可能的记录类型:

// 0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。 
// 1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。 
// 2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。 
// 3 - 错误发送到文件目标字符串。 
 
// destination 可选。规定向何处发送错误消息。该参数的值依赖于 "type" 参数的值。 
// headers 可选。只在 "type" 为 1 时使用。

// 规定附加的头部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。

// 注释:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置。
 

// $test=2;

// if ($test>1)
// {
// 	error_log("A custom error has been triggered",1,"someone@example.com","From: webmaster@example.com");
// }


date_default_timezone_set("PRC");//设置时区【也可以在php.ini中设置】
function SetPhone($value='0')
{
	if(!is_string($value))
	{
		error_log(date("Y-m-d G:i:s")."输入类型错误\r\n",3,"error.txt");
	}
	else if (strlen($value)>11) {
		error_log(date("Y-m-d G:i:s")."号码长度过长\r\n",3,"error.txt");
	}
}

//发生的错误信息会记录到当前文件同目录下的error.txt文件中
// SetPhone("1252345345456");
// SetPhone(12254);


/*
PHP 异常处理
============
try{
	可能出现异常的代码块
}catch(Exception $e){
	处理异常/抛出异常
}

抛出一个异常:throw new Exception("异常信息");

Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。 
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch" 
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象 

注意:
当出现异常后,则出现异常的代码之后的代码不再执行
使用多个catch可以捕获多种类型的异常信息
PHP5.0 以前的函数没有异常机制,无法捕获异常,只能使用错误处理机制处理

设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。

异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。 
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。 
使用多个 catch 代码块可以捕获不同种类的异常。 
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。 
简而言之:如果抛出了异常,就必须捕获它。

自定义异常类:class MyException1 extends Exception(){}

*/
function DelUser($userName)
{
	if($userName=="admin")
	{
		throw new Exception("删除失败");
	}
}

// try{
// 	DelUser("admin");
// 	echo "我被执行了";//这句代码不会被执行(某句代码出异常了,则后面的代码不再执行)
// }catch(Exception $e){//捕获异常信息
	
// 	echo($e->getMessage());//$e->getMessage()获得异常信息
// 	echo(" 错误行:".$e->getLine());
// }


//设置顶层异常处理器 set_exception_handler() 
//作用:用于捕获未捕获的异常信息
function MyException($e)
{
	echo "\n顶级异常处理器捕获异常:".$e->getMessage();
}
set_exception_handler("MyException");
// DelUser("admin");



//自定义异常类:class MyException1 extends Exception
class MyException1 extends Exception
{

}
class MyException2 extends Exception
{

}
function A()
{
	throw new MyException1("aaa");
}
function B()
{
	throw new MyException2("bbb");
}

try{
	A();
	B();
}
catch(MyException1 $e1){
	echo $e1->getMessage();
}
catch(MyException2 $e2){
	echo $e2->getMessage();
}

?>

转载于:https://www.cnblogs.com/lt-style/p/3501057.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值