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();
}
//返回
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值