PHP异常处理机制详解

2018-08-06 09:16:00
linefo
原创
586


前言


PHP的异常处理机制,是一种“意料之中”的处理机制,即我们知道可能会发生异常的位置,在这个位置去做处理。


异常的定义


一般来说,指业务层面上的异常。比如业务上规定接收“姓名”时不能为空,那么接收到空的“姓名”,就是触发了一个异常。


为什么使用异常处理


异常处理机制不是必须要使用的,但使用后可以带来很多方便。

简单说两个原因:
(1)逻辑规范、简洁;项目中要处理各种错误码或者不应该的值等,用异常去处理,逻辑上更加规范化。

(2)......


异常基本处理流程


抛出异常(满足某种条件下抛出)——>捕获异常(可以选择是否处理)


抛出一个异常


<?php
	if(1 > 0){ // 满足某种条件
		throw new Exception("抛出一个异常"); // throw:关键字(抛出特定用的),new Exception():异常处理基类
	}


运行效果:

如果抛出异常后没有去捕获,则会产生fatal error(致命错误),终止程序运行


异常处理基类


这部分先列出,以便理解下面章节的内容。

PHP本身有一个异常处理类(Excepion类),可以提供发生异常时的相关信息。


列一下方法:


***********************************************************************************************************

Exception::__construct — 异常构造函数

(需要列一下这个构造函数的信息)

【说明】

public Exception::__construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )
【参数】

message:抛出的异常消息内容。
code:异常代码。
previous:异常链中的前一个异常。

**************************************************************************************************************


Exception::getMessage — 获取异常消息内容
Exception::getPrevious — 返回异常链中的前一个异常
Exception::getCode — 获取异常代码
Exception::getFile — 获取发生异常的程序文件名称
Exception::getLine — 获取发生异常的代码在文件中的行号
Exception::getTrace — 获取异常追踪信息
Exception::getTraceAsString — 获取字符串类型的异常追踪信息
Exception::__toString — 将异常对象转换为字符串
Exception::__clone — 异常克隆


当然在我们实际使用中,常常会将该基类封装一遍,做一个自己特定的异常处理类。


Try, throw 和 catch(异常处理代码结构)


throw我们上面写到是用于抛出异常的。

配合try和catch我们可以实现整个抛出——>捕获的异常处理流程。


<?php
	// 创建一个抛出异常的函数
	function test(){
		throw new Exception("抛出一个异常");
	}
	
	// try代码块中会触发异常
	try{
		test();
	}catch(Exception $e){ // 这里捕获异常
		echo "Message:".$e->getMessage(); // 输出“Message:抛出一个异常”
	}


try代码块:里面是尝试执行的代码,并且里面可能会有异常抛出的情况。

catch代码块:如果捕获到了抛出的异常,怎么去处理它

Exception $e这个意思是新建一个Exception类的对象$e。


创建自定义的异常处理类


这个没什么好说的,利用PHP面向对象知识里面的继承就可以了,去继承Exception异常处理基类。

如果对面向对象不熟悉,可以看一下我那篇PHP面向对象详解的文章。


异常抛出多次


我们可以在捕获到某个抛出的异常时,可以对其进行再次抛出。

这里写一个自定义类,可以看一下封装起到的作用。


<?php
	 // 自定义异常处理类:简单封装一下Exception基类
	class MyException extends Exception{
		public function getNewMessage(){
			return "新信息:".$this->getMessage();
		}
	}
	
	// 通过try和catch结构的嵌套实现再次抛出异常的效果
	try{
		try{
			throw new Exception("抛出一个异常");
		}catch(Exception $e){
			throw new MyException($e->getMessage());
		}
	}catch(MyException $ex){
		echo $ex->getNewMessage();
	}


设置顶层异常处理器


在实际项目中,我们基本不会在每个地方写满try....catch语句结构。

一般通过设置set_exception_handler()函数设置一个顶层异常处理器,用它可以捕获所有(全局或控制部分区域)未被catch捕获的抛出异常。


<?php
	// 异常处理函数
	function _exception_handler($e){
		echo "新:".$e->getMessage();
	}
	
	// 设置_exception_handler为顶层异常处理函数
	set_exception_handler("_exception_handler");
	
	throw new Exception("抛出一个异常");
	


逻辑异常和运行异常


相关的是LogicException类和RuntimeException类,暂还不理解有什么意义,以后再补充。

感觉至少在用法上没有差别。

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277