PHP 中自定义Exception的必要性

在PHP中有一个自带的异常类叫做Exception。但是我看别人的代码时看到好多自定义的Exception,进去一看他们也只是继承了自带的Exception类并没有重写或者增加方法或属性,所以我有一个疑问:自定义Exception是否有必要,如果我的项目从头到尾都只用自带的Exception是不是显得代码不够“漂亮”。

阅读 7.5k
5 个回答
开闭原则对接口编程,依赖于抽象而不依赖于具体。

继承Exception后的各sonException可以实现更多的按需原则,如楼上所说

class WechatException   extends Exception{}   
class DatabaseException extends Exception{}        
  • WechatException类虽然最后也是抛异常但是它可能还有其他的一系列操作,比如WechatException是跟微信相关的状态码
  • thorw WechatException你知道这是抛的微信相关的异常
迪米特法则(最少知道原则)一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
  • Exception解耦到两个模块中,而不是直接抛出

不是不够漂亮。
举个简单的例子

假设我做个读取微信用户信息写入本地数据库的应用。
如果出错就会抛出异常。
如果不定义异常类。 只知道跑错了,究竟是微信报错还是数据库报错只能判断报错的文案。
如果自定义异常类就可以自定义WechatExceptionDatabaseException了。
catch的时候

try{
}catch(WechatException $e) {
 echo "微信错误:".$e->message;
}catch(DatabaseException $e) {
    echo "数据库错误";
}

自定义异常有效的为未来日志系统做准备,当时也是开发之中不可缺少的一部分,无论再调试,错误日志收集中都占据极高的地位。

自定义异常有两个意义:

  1. 语义
    自带的 Exception 类就像 htmldiv 标签,可以用,但是无语义,自定义异常是为了给异常分类,相当于给 div 语义,html5 的许多新标签在默认样式方面跟 div 几乎一模一样,但是赋予了语义,例如 articlesectionfooter ... 等等等等
  2. 自定义异常内容和处理方法
    当然,除了语义之外,自定义异常还可以实现更灵活的异常处理。例如 ValidationException 这个异常类 ,看名字我们知道是验证未通过造成的异常,那么具体是哪些数据未通过验证呢?我们就可以通过添加 getErrors 方法来获取具体的异常信息。

这些Exception子类 要的就是它的名字. 里面的数据一般Exception就可以满足.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题