在PHP中有一个自带的异常类叫做Exception。但是我看别人的代码时看到好多自定义的Exception,进去一看他们也只是继承了自带的Exception类并没有重写或者增加方法或属性,所以我有一个疑问:自定义Exception是否有必要,如果我的项目从头到尾都只用自带的Exception是不是显得代码不够“漂亮”。
在PHP中有一个自带的异常类叫做Exception。但是我看别人的代码时看到好多自定义的Exception,进去一看他们也只是继承了自带的Exception类并没有重写或者增加方法或属性,所以我有一个疑问:自定义Exception是否有必要,如果我的项目从头到尾都只用自带的Exception是不是显得代码不够“漂亮”。
不是不够漂亮。
举个简单的例子
假设我做个读取微信用户信息写入本地数据库的应用。
如果出错就会抛出异常。
如果不定义异常类。 只知道跑错了,究竟是微信报错还是数据库报错只能判断报错的文案。
如果自定义异常类就可以自定义WechatException
和DatabaseException
了。
catch的时候
try{
}catch(WechatException $e) {
echo "微信错误:".$e->message;
}catch(DatabaseException $e) {
echo "数据库错误";
}
自定义异常有两个意义:
Exception
类就像 html
的 div
标签,可以用,但是无语义,自定义异常是为了给异常分类,相当于给 div
语义,html5
的许多新标签在默认样式方面跟 div
几乎一模一样,但是赋予了语义,例如 article
、 section
、footer
... 等等等等ValidationException
这个异常类 ,看名字我们知道是验证未通过造成的异常,那么具体是哪些数据未通过验证呢?我们就可以通过添加 getErrors
方法来获取具体的异常信息。1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答889 阅读✓ 已解决
1 回答573 阅读✓ 已解决
开闭原则对接口编程,依赖于抽象而不依赖于具体。
继承
Exception
后的各sonException
可以实现更多的按需原则,如楼上所说WechatException
类虽然最后也是抛异常但是它可能还有其他的一系列操作,比如WechatException
是跟微信相关的状态码thorw WechatException
你知道这是抛的微信相关的异常迪米特法则(最少知道原则)一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
Exception
解耦到两个模块中,而不是直接抛出