• [六字真言]2.嘛.异常定制和通用.md


    幻世当空 恩怨休怀
    舍悟离迷 六尘不改
    且怒且悲且狂哉!

    最近一直在循环的一首歌!

    丰富自己,比取悦他人更有力量。种下梧桐树,引得凤凰来。你若盛开,蝴蝶自来!

    言归正传! 言归正传!

    不要去大包大揽

    人懒就是动力,我上课的时候为了图省事,经常利用 Exception 捕捉所有潜在的异常这里更正一下,这样的思想不对的,人的能力和经历是有限的,不要让他成为万能的!

    1. publicvoid update(User user){
    2. try{
    3. // 假设场景
    4. //…抛出 IOException 的代码调用
    5. //…抛出 SQLException 的代码调用
    6. }catch(Exception e){
    7. //这里利用基类 Exception 捕捉的所有潜在的异常,如果多个层次这样捕捉,会丢失原始异常的有效信息
    8. thrownewRuntimeException("Exception in com.shxt.UserDao.update异常", e);
    9. }
    10. }

    建议重构代码为:

    1. publicvoid update(User user){
    2. try{
    3. // 假设场景
    4. //…抛出 IOException 的代码调用
    5. //…抛出 SQLException 的代码调用
    6. }catch(IOException e){
    7. //仅仅捕捉 IOException
    8. thrownewRuntimeException(/*指定这里 IOException 对应的错误代码*/code,"Exception in update", e);
    9. }catch(SQLException e){
    10. //仅仅捕捉 SQLException
    11. thrownewRuntimeException(/*指定这里 SQLException 对应的错误代码*/code,"Exception in update", e);
    12. }
    13. }

    我懒,我就要大包大揽

    人懒,就是动力,胖哥就是这样!
    假设我们现在做的业务中,需要在一个方法抛出的异常有如下的种类
    登录异常/密码异常/角色异常/账号异常/访问异常等等

    1. publicvoid update(User user){
    2. try{
    3. // 假设场景
    4. //…抛出 登录异常 的代码调用
    5. //…抛出 密码异常 的代码调用
    6. //…抛出 角色异常 的代码调用
    7. //…抛出 访问异常 的代码调用
    8. }catch(登录异常 ex){
    9. thrownewRuntimeException(“Exception in update”, ex);
    10. }catch(密码异常 ex){
    11. thrownewRuntimeException(“Exception in update”, ex);
    12. }catch(角色异常 ex){
    13. thrownewRuntimeException(“Exception in update”, ex);
    14. }catch(访问异常 ex){
    15. thrownewRuntimeException(“Exception in update”, ex);
    16. }
    17. }

    晕了,这么多代码,疯掉了吗?念一下六字真言'打赏啊!打赏啊!'

    如果你是一个比较执着的人,也比较喜欢这种方式的人,那么胖哥下面要说的就不要看了!不然就迷糊了!(^__^) 嘻嘻……

    代码重构

    1. publicvoid update(User user){
    2. try{
    3. // 假设场景
    4. //…抛出 登录异常 的代码调用
    5. //…抛出 密码异常 的代码调用
    6. //…抛出 角色异常 的代码调用
    7. //…抛出 访问异常 的代码调用
    8. }catch(Exception e){
    9. thrownewRuntimeException(“Exception in com.shxt.UserDao.update异常”, e);
    10. }
    11. }

    一如既往的将 Exception 转换成 RuntimeException,但是这里的 e 其实是 RuntimeException 的实例,已经在前端代码中封装过

    靠,玩死我算了!这样下去可没有朋友啊!不就是又改回来了吗?

    解决办法:

    1. 可以在 RuntimeException 类中添加相关的检查,确认参数 Throwable 不是 RuntimeException 的实例。如是,将拷贝相应的属性到新建的实例上。
    2. 用不同的 catch 语句块捕捉 RuntimeException 和其它的 Exception。

    世界之大无奇不有,心中默念六字真言:"打赏啊!打赏啊!"





  • 相关阅读:
    建立适当的索引
    Windows 10Bash命令
    代码生成工具介绍和使用
    分布式的任务调度框架
    Net分布式系统
    Keepalived+LVS+Nginx负载均衡之高可用
    call,apply,bind
    2015搜狐在线笔试题(内存泄露问题)(转)
    十步完全理解SQL(转)
    Linux shell用法和技巧(转)
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/3deedbb7ac7452efb22416a13e40b560.html
Copyright © 2020-2023  润新知