[六字真言]2.嘛.异常定制和通用.md
幻世当空 恩怨休怀
舍悟离迷 六尘不改
且怒且悲且狂哉!
最近一直在循环的一首歌!
丰富自己,比取悦他人更有力量。种下梧桐树,引得凤凰来。你若盛开,蝴蝶自来!
言归正传! 言归正传!
不要去大包大揽
人懒就是动力,我上课的时候为了图省事,经常利用 Exception 捕捉所有潜在的异常这里更正一下,这样的思想不对的
,人的能力和经历是有限的,不要让他成为万能的!
publicvoid update(User user){
try{
// 假设场景
//…抛出 IOException 的代码调用
//…抛出 SQLException 的代码调用
}catch(Exception e){
//这里利用基类 Exception 捕捉的所有潜在的异常,如果多个层次这样捕捉,会丢失原始异常的有效信息
thrownewRuntimeException("Exception in com.shxt.UserDao.update异常", e);
}
}
建议重构代码为:
publicvoid update(User user){
try{
// 假设场景
//…抛出 IOException 的代码调用
//…抛出 SQLException 的代码调用
}catch(IOException e){
//仅仅捕捉 IOException
thrownewRuntimeException(/*指定这里 IOException 对应的错误代码*/code,"Exception in update", e);
}catch(SQLException e){
//仅仅捕捉 SQLException
thrownewRuntimeException(/*指定这里 SQLException 对应的错误代码*/code,"Exception in update", e);
}
}
我懒,我就要大包大揽
人懒,就是动力,胖哥就是这样!
假设我们现在做的业务中,需要在一个方法抛出的异常有如下的种类
登录异常/密码异常/角色异常/账号异常/访问异常等等
publicvoid update(User user){
try{
// 假设场景
//…抛出 登录异常 的代码调用
//…抛出 密码异常 的代码调用
//…抛出 角色异常 的代码调用
//…抛出 访问异常 的代码调用
}catch(登录异常 ex){
thrownewRuntimeException(“Exception in update”, ex);
}catch(密码异常 ex){
thrownewRuntimeException(“Exception in update”, ex);
}catch(角色异常 ex){
thrownewRuntimeException(“Exception in update”, ex);
}catch(访问异常 ex){
thrownewRuntimeException(“Exception in update”, ex);
}
}
晕了,这么多代码,疯掉了吗?念一下六字真言'打赏啊!打赏啊!'
如果你是一个比较执着的人,也比较喜欢这种方式的人,那么胖哥下面要说的就不要看了!不然就迷糊了!(^__^) 嘻嘻……
代码重构
publicvoid update(User user){
try{
// 假设场景
//…抛出 登录异常 的代码调用
//…抛出 密码异常 的代码调用
//…抛出 角色异常 的代码调用
//…抛出 访问异常 的代码调用
}catch(Exception e){
thrownewRuntimeException(“Exception in com.shxt.UserDao.update异常”, e);
}
}
一如既往的将 Exception 转换成 RuntimeException,但是这里的 e 其实是 RuntimeException 的实例,已经在前端代码中封装过
靠,玩死我算了!这样下去可没有朋友啊!不就是又改回来了吗?
解决办法:
- 可以在 RuntimeException 类中添加相关的检查,确认参数 Throwable 不是 RuntimeException 的实例。如是,将拷贝相应的属性到新建的实例上。
- 用不同的 catch 语句块捕捉 RuntimeException 和其它的 Exception。
世界之大无奇不有,心中默念六字真言:"打赏啊!打赏啊!"