我们用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返回错误信息呢…