PHP异常的用法


我们用PHP编程,大多数都用MVC模式吧. 还有的分的各多的层,比如数据访问层,业务逻辑层共同组成M. 数据访问层还能再分. 但是, 分多了后, 一旦出错, 就不知如何是好了. 是自己处理这个错误,还是告诉上层调用出错了呢? 怎么告诉上层或者上上层,我这里出错了呢?

如果不用异常. 那么就是这样: 底层方法出错, 返回false. 或者错误码(如果上层需要区分错误的话). 可能这个时候上层也属于很低的层次, 那就还需要继续向上抛这个错误, 继续返回false或者错误码. 直到最终业务逻辑层, 它认为它可以处理这个错误. 并组织错误信息提示给用户了.

用这种方式的代码可能是:

class Db{

	public function getUserInfo(){
		return false;
	}
}

class User{
	public function writeUserInfoToFile($filename){
		$db = new Db();
		$userInfo = $db->getUserInfo();
		if ($userInfo === false){
			return false;
		}
		if (!file_exists($filename)){
			return false;
		}
		if (file_put_contents($filename, $userInfo)){
			return true;
		}
		return false;
	}
}

$user = new User();
if ($user->writeUserInfoToFile('not_exists_file')){
	echo '尊敬的用户, 您的操作已成功!';
}else{
	echo '我会跟你说我也不知道哪出错了么?!';
}

而使用异常后, 可能是这样的:

<?php

class DbException extends Exception{
}

class FileNotExistsException extends Exception{
}

class Db{

	public function getUserInfo(){
		throw new DbException('db exception');
	}
}

class User{

	public function writeUserInfoToFile($filename){
		$db = new Db();
		$userInfo = $db->getUserInfo();
		if (!file_exists($filename)){
			throw new FileNotExistsException('file not found');
		}
		if (file_put_contents($filename, $userInfo)){
			return true;
		}
		return false;
	}
}
try{
	$user = new User();
	$user->writeUserInfoToFile('not_exists_file');
	echo '尊敬的用户, 您的操作已成功!';
}catch (DbException $e){
	echo '额, 数据库挂了我会跟你说么...';
}catch (FileNotExistsException $e){
	echo '提示用户的时候我会跟你说这是写文件出错了么?!';
}

使用异常, 底层可捕获特定异常进行处理. 比如数据从redis中获取,网络错误, redis抛出异常. 我们就可以捕获.然后改由mysql中取.

把自己处理不了的异常向上抛. 直到能处理它的catch为止. 这样错误的传递就简单多了.


《“PHP异常的用法”》 有 2 条评论

    • – -! 可, 用了那个以后, 怎么知道是哪里出的问题. 虽然说知道错误了. 但是不好回显给用户啊.. 比如, 是html方式显示错误页面呢. 还是ajax返回错误信息呢…

回复 摩西、摩西 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注