`
zccst
  • 浏览: 3295002 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP异常处理

    博客分类:
  • PHP
 
阅读更多
作者:zccst

一、基本用法

Exception()方法是抛出异常的基类。
try{
    ...
}catch(Exception $e){
    ...
}

在逻辑中抛异常
throw new Exception();
throw new 自定义异常。

二、扩展一个异常的方式
1,简单方式
class OutsourceNotFoundException extends Exception {}


2,扩展方式
class OutsourceTimeoutException extends Exception {
	public $status;
	public function __construct($status, $msg) {
		$this->status = $status;
		parent::__construct($msg);	
	}
}

三、总结
1,结合事务回滚,可以有很好的用户体验
2,可以连续catch()多个不同的异常,并区别对待
3,可以直接throw异常,让上一级来捕捉该异常

实例:
本处逻辑:
		$trans = Yii::app()->db->beginTransaction();
		try {
			//在该方法中,可以抛异常,让上级逻辑来捕捉,并直接返回到前端。
			Yii::app()->dispatcher->notify(new sfEvent($this, 'sta.saveTimeoutReason', array('id'=>$params['timeout_reason_id'])));
			//也可以在本级直接捕捉该异常,保存数据,然后抛出来,再让上一级捕捉(区别是此时异常性质变了,从特殊异常变为常规异常)
			Yii::app()->dispatcher->notify(new sfEvent($this, 'outsource.complete', array('user_id' => $params['user_id'], 'is_force' => $params['is_force'])));

			OutsourceStatusLog::log($this,$params['dst_status_id'], $params['user_id'], "确认完成");
			$this->status_id = $params['dst_status_id'];
			$this->save();

			$trans->commit();
		}
		catch(FinishCheckException $e) { //【疑问1:如果只有FinishCheckException,即数据保存了。但只保存到抛出异常的位置?后面的呢?】
			$this->save();
			$trans->commit(); // 结单检测异常属于可控异常, 先把数据保存一下
			throw $e;         // 抛出的该异常,仍然是FinishCheckException类型(留给上一级捕捉)
		}
		catch(Exception $e) {
			$trans->rollBack(); // 【疑问2:如果捕捉到常规异常就全部回滚?也即除了FinishCheckException异常都回滚】
			throw $e;
		}



上级逻辑:
		try {
			$outsource = Outsource::model()->findByCommOid($oid);
			
			if(!$this->current_user->isMemberOfIdc($outsource->idc_id)) {
				$msg = "你不是xx";
				$this->response(array('status' => 1, 'msg' => $msg));
			}

			$result = $outsource->doAction($action, $params);

			if($result) {
				$this->user->setFlash('info', $result);
			}

		}
		catch(OutsourceNotFoundException $e) {
			$this->response(array('status' => 1, 'msg' => $e->getMessage()));	
		}
		catch(NotCompleteException $e) {
			$this->response(array('status' => 2, 'msg' => $e->getMessage()));	
		}
		catch(FinishCheckException $e) {
			// 结单检测接口, 需要显示当前截单接测结果和进度
			$this->response(array('status' => $e->status, 'result' => $e->getMessage()));
		}
		catch(OutsourceTimeoutException $e) {
			// 结单需要检查是否超时
			$this->response(array('status' => $e->status, 'result' => $e->getMessage()));
		}
		catch(OutsourceOperateNotAllowedException $e) {
			$error = "该外包单的状态已经发生变化,可能其他用户已经操作。请刷新";
		}
		catch(Exception $e) {
			Yii::app()->exception_watcher->notify_exception($e);
			$error = $e->getMessage();
		}
		//返回
分享到:
评论

相关推荐

    php异常处理方法实例汇总

    本文实例讲述了php异常处理方法。分享给大家供大家参考。具体如下: <?php $path = "D://in.txt"; try //检测异常 { file_open($path); } catch(Exception $e) //捕获异常 { echo $e->getMessage(); } ...

    计算机后端-PHP最佳开发入门实战课程09-04 PHP异常处理-1.mp4

    计算机后端-PHP最佳开发入门实战课程09-04 PHP异常处理-1.mp4

    计算机后端-PHP最佳开发入门实战课程09-04 PHP异常处理-2.mp4

    计算机后端-PHP最佳开发入门实战课程09-04 PHP异常处理-2.mp4

    PHP异常处理.docx

    本教程稳定详细的介绍了PHP异常的触发、抛出与捕获,PHP新手可以阅读学习

    PHP异常处理定义与使用方法分析

    本文实例讲述了PHP异常处理定义与使用方法。分享给大家供大家参考,具体如下: <?php //php5提供了基本的异常处理类,可直接使用 ,不需要自己再定义 // class Exception // { // protected $message = 'Unknown ...

    PHP异常类及异常处理操作实例详解

    本文实例讲述了PHP异常类及异常处理操作。分享给大家供大家参考,具体如下: 异常处理归类于错误处理,PHP从5.1.0开始增加了Exception异常处理类。 一、异常处理 PHP 异常处理与Java相似,都使用try、throw、catch...

    轻松学PHP之PHP的错误和异常处理

    轻松学PHP之PHP的错误和异常处理,可以轻松学习PHP。PHP学习的宝典。PHP的错误和异常处理是非常重要的。

    PHP异常处理浅析

    主要介绍了PHP异常处理浅析,本文着重讲解如何捕获异常,并给出代码操作实例,需要的朋友可以参考下

    php 异常处理实现代码

    php 异常处理代码,后面都有详细的说明。最近的php将会让你学到更多。

    php异常处理使用示例

    主要介绍了php异常处理使用示例,代码说明了普通错误和致命错误捕获及处理的方法,需要的朋友可以参考下

    php异常处理捕获错误整理

    在本篇文章里小编给大家整理的是关于php异常处理捕获哪些错误的相关知识点,有需要的朋友们学习下。

    详细解读php的异常处理机制-参考源码

    详细解读php的异常处理机制-参考源码

    php异常处理技术,顶级异常处理器

    这里的My_expection是开发者自定义的异常处理函数,既顶级异常处理器,只有当程序中没有函数来处理异常才有顶级异常处理器来处理异常,如果没有定义顶级异常处理器,则由系统默认的异常处理器来处理异常 举例说明:...

    PHP异常处理Exception类

    异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。 当异常被触发时,通常会发生: 当前代码状态被保存 代码执行被切换到预定义的异常处理器函数 根据情况,处理器也许会从保存的...

    扩展php内置的异常处理类

    一个扩展php内置的异常处理类,在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象。虽然在PHP中提供的内置异常处理类Exception,...

    扩展php内置的异常处理类.zip

    一个扩展php内置的异常处理类,在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象。虽然在PHP中提供的内置异常处理类Exception,...

Global site tag (gtag.js) - Google Analytics