我们用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 条评论
用那么多catch … 加个 set_exception_handler 吧
– -! 可, 用了那个以后, 怎么知道是哪里出的问题. 虽然说知道错误了. 但是不好回显给用户啊.. 比如, 是html方式显示错误页面呢. 还是ajax返回错误信息呢…