资讯专栏INFORMATION COLUMN

[六字真言]1.唵.遁入佛门之异常.md

Baaaan / 3329人阅读

摘要:出现这种情况的可能性太多太多,例如服务器连接不上参数不正确等。调用代码需要进一步处理和恢复。当然清理资源后,可以继续抛出非检测异常,阻止程序的执行。根据观察和理解,检测异常大多可以应用于工具类中。

“唵”,表示佛部心,谓念此字时,自己的身体要应于佛身,口要应于佛口,意要应于佛意,所谓身、口、意与佛成一体,才能获得成就;

异常的选择

异常的分类,你应该知道:

受审查异常

非受审查异常

发现学生在使用过程当中,没有区分,也不知道应该什么时候使用?跟不清楚怎么样合理的使用异常!
我再后面接手的课程体系当中,学生如果在使用异常的情况下,最爱的是Exception,怎么解释呢,简单好用?只能心里默默的呵呵!而作为一名开发人员使用比较多的是非受审查异常[继承RuntimeException]!往往这个时候,学生就懵圈了,为什么呢?因为看不到错误了,不知道哪里错了!
心在滴血,因为给自己增加了难度,何必难为自己嫩?
那么,如何使用异常呢?简单说一下个人的理解:

调用或者执行的代码不能继续执行,需要立即终止。出现这种情况的可能性太多太多,例如服务器连接不上、参数不正确等。这些时候都适用非检测异常,不需要调用代码的显式捕捉和处理,而且代码简洁明了。

调用代码需要进一步处理和恢复。假如将 SQLException 定义为非检测异常,这样操作数据时开发人员理所当然的认为 SQLException 不需要调用代码的显式捕捉和处理,进而会导致严重的 Connection 不关闭、Transaction 不回滚、DB 中出现脏数据等情况,正因为 SQLException 定义为检测异常,才会驱使开发人员去显式捕捉,并且在代码产生异常后清理资源。当然清理资源后,可以继续抛出非检测异常,阻止程序的执行。根据观察和理解,检测异常大多可以应用于工具类中。

胖先生说一下:

让机器自己去处理,我们不管!

就是我们需要捕获并且自己处理

在实际开发当中,胖显示都会把受审查变成非受审查的,但是同时我根据自己的业务需要进行处理!

别把客户想的太聪明

将异常直接打印在客户端的例子屡见不鲜,以 JSP 为例,一旦代码运行出现异常,默认情况下容器将异常堆栈信息直接打印在页面上。其实从客户角度来说,任何异常都没有实际意义,绝大多数的客户也根本看不懂异常信息,软件开发也要尽量避免将异常直接呈现给用户。

客户都是比较懒的人,如果出现那种文字,站在你的角度,我想会感觉到厌恶,考察我英语四级能力呢?

 package com.pangsir.test.sample.exception;
 /**
  * 自定义 RuntimeException
  * 添加错误代码属性,一种简单的封装
  */
 public class RuntimeException extends java.lang.RuntimeException { 
     //默认错误代码 
     public static final Integer GENERIC = 1000000; 
     //错误代码
     private Integer errorCode; 
      public RuntimeException(Integer errorCode, Throwable cause) {
             this(errorCode, null, cause);
      }
      public RuntimeException(String message, Throwable cause) {
             //利用通用错误代码
             this(GENERIC, message, cause);
      }
      public RuntimeException(Integer errorCode, String message, Throwable cause) {
             super(message, cause);
             this.errorCode = errorCode;
      }
      public Integer getErrorCode() {
             return errorCode;
      } 
 }

正如示例代码所示,在异常中引入错误代码,一旦出现异常,我们只要将异常的错误代码呈现给用户,或者将错误代码转换成更通俗易懂的提示。其实这里的错误代码还包含另外一个功能,开发人员亦可以根据错误代码准确的知道了发生了什么类型异常.

别玷污我

我们授课当中经常说基于MVC思想的开发架构,因此我们将代码分为controller,Service,Dao等不同的层次,Dao层中经常会抛出异常的方法[因为不熟练,因为SQL语句经常写错误],都是过来人:
Dao层代码:

public User load(Integer user_id) throw SQLException {
//根据 ID 查询数据库,获取用户对象信息
}

如果代码是这样写的,没有什么问题,可以说正确,但是不符合规范!
从设计耦合角度仔细考虑一下,这里的 SQLException 污染到了上层调用代码,调用层需要显式的必须利用 try-catch 捕捉 或者 向更上层次继续抛出。根据隔离原则,我们可以适当修改成:

 public User load(Integer user_id) {
      try{
             //根据 ID 查询数据库
      }catch(SQLException e){
          //利用非检测异常封装检测异常,降低层次耦合
         throw new RuntimeException(SQLErrorCode, e);
      }finally{
             //关闭连接,清理资源
      }
 }
别不在乎我的感受

在学生开发当中,也可以说我为了图省事的过程当中,经常说的一句话就是你把异常输出[打印]控制台中,其实这样没有任何意思!
重要|重要|重要:

这样的处理没有意思,因为你没有中断程序的执行,进而调用代码会继续自行,导致更多的异常

想想你是否写过这样的代码:

 public void update(User user){
    try{
        //..some code that throws SQLException
     }catch(SQLException ex){
      /**
        *了解的人都知道,这里的异常打印毫无意义,仅仅是将错误堆栈输出到控制台。
        * 而在 Production[生产] 环境中,需要将错误堆栈输出到日志。
        * 而且这里 catch 处理之后程序继续执行,会导致进一步的问题
        * */

      ex.printStacktrace();
     }
 }

代码重构

 public void update(User user){
  try{
     //..some code that throws SQLException
  }
  catch(SQLException ex){
     //转换成非受审查异常
     throw new RuntimeException(“自己描述性语言,例如com.pangsir.user.dao.UserDao.update 执行过程出错”, ex);
  }
  finally{
     //关闭资源
  }
 }

这个误区比较基本,一般情况下都不会犯此 > 低级错误 < 。

地主家也没有余粮

看一下,下面的代码是否有问题?

 //假设获取用户的所有信息
 List userList = this.userDao.listAll();//
 for(int i=0; i

在讲课的时候我们已经知道异常处理占用系统资源.别把这个多带带看成一个演示示例,想想我们的设计当中从控制层->Service->Dao层

换个角度说,类 A 中执行了一段循环,循环中调用了 B 类的方法,B 类中被调用的方法却又包含 try-catch 这样的语句块。褪去类的层次结构,代码和上面如出一辙。

还有一次隐藏的错误,这里我就不说了!有过有知道请留言给我,不是错误,就是不符合地主家没有余粮的概念!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65089.html

相关文章

  • Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息

    原文地址: http://www.jtahstu.com/blog/s... Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 零、开发环境 MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports) CPU : 2 GHz Intel Core i5 RAM : 8 GB 1867 MHz LPDDR3 Python 版本: v3...

    caohaoyu 评论0 收藏0
  • Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息

    原文地址: http://www.jtahstu.com/blog/s... Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 零、开发环境 MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports) CPU : 2 GHz Intel Core i5 RAM : 8 GB 1867 MHz LPDDR3 Python 版本: v3...

    zero 评论0 收藏0
  • 上古程序猿坚决反对用Redis,我该怎么说服他?

    摘要:前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使用。上古程序猿坚决反对用,我该怎么说服他分布式锁如果你是一位后端工程师,面试时八成会被问到,特别是大厂,不仅要求能简单使用,还要深入理解底层原理,具备解决常见问题的能力。 前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使用Redis。那位上古程序猿设计公司...

    番茄西红柿 评论0 收藏2637
  • 上古程序猿坚决反对用Redis,我该怎么说服他?

    摘要:前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使用。那位上古程序猿设计公司的业务系统时候,始终坚持永远不要用缓存其他人想用,例如做个接口防重复,一定要用数据库来实现,包括定期失效之类的功能。项目中使用,主要考虑性能和并发。 前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使...

    不知名网友 评论0 收藏0
  • 上古程序员实名反对用Redis,我是拿他没办法了

    摘要:前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使用。那位上古程序猿设计公司的业务系统时候,始终坚持永远不要用缓存其他人想用,例如做个接口防重复,一定要用数据库来实现,包括定期失效之类的功能。项目中使用,主要考虑性能和并发。 前段时间,有个人吐槽自己的同事是上古程序猿,一直坚持反对使...

    不知名网友 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<