当前位置 > 主页 > 万和大讲堂 >


异常封装提高Java代码质量 南京Java培训

2016-03-10 10:23

  一、分析

 

  Java语言的异常处理机制可以确保程序的健壮性,提高系统的开发效率,但是Java API提供的异常都是比较低级(这里的低级指的是"低级别的异常"),只有开发人员才能看的懂,才明白发生了什么问题。对于终端用户来说,这些异常基本上是天书,与业务无关,是纯计算机语言的描述。南京Java软件培训

 

  这就需要我们对异常进行封装了。

 

  二、场景

 

  异常封装有三方面的优点:

 

  1.提高系统的友好性

 

  例如,打开一个文件,如果文件不存在,则会报FileNotFoundException异常,如果该方法的编写不做任何处理,直接上抛上层,则会降低系统的友好性,代码如下所示:南京Java软件培训

 

  public static void doStuff()

 

  InputStream is = new FileInputStream("无效文件。txt");

 

  /*文件操作

 

  此时doStuff方法的友好性极差:出现异常时(比如文件不存在),该方法直接把FileNotFoundException异常抛出到上层应用中(或者是终端用户),而上层应用(或用户)要么自己处理,要么接着抛出,最终的结果就是让用户对着"天书"式的文字发呆,用户不知道这是什么问题,只是系统告诉他"哦,我出错了,什么错误?你自己看着办吧。南京Java软件培训

 

  解决办法就是封装异常,可以把系统的阅读者分为两类:开发人员和用户。开发人员查找问题,需要打印出堆栈信息,而用户则需要了解具体的业务原因,比如文件太大,不能同时编写文件等,代码如下:

 

  public static void doStuff2()

 

  InputStream is = new FileInputStream("无效文件。txt");

 

  }catch(FileNotFoundException e)

 

  //为了方便开发和维护人员而设置的异常信息

 

  e.printStackTree();南京Java软件培训

 

  //抛出业务异常

 

  throw new MyBussinessException(e);

 

  2.提高系统的可维护性

 

  public void doStuff()

 

  }catch(Exception e)

 

  e.printStackTrace();

 

  这是很多程序员容易犯的错误,抛出异常是吧?分类处理多麻烦,就写一个catch块来处理所有异常吧。而且还信誓旦旦的说"JVM会打印出栈中的错误信息",虽然这没有错,但是该信息只有开发人员自己才看的懂,维护人员看见这段异常基本上无法处理,因为需要深入到代码逻辑中去分析问题。南京Java软件培训

 

  正确的做法是对异常进行分类处理,并进行封装输出,代码如下:

 

  public void doStuff()

 

  }catch(FileNotFoundException e)

 

  log.info("文件夹未找到,使用默认配置文件…");

 

  }catch(SecurityException 3)

 

  log.info("无权访问,可能原因是…");

 

  e.printStackTrace();南京Java培训机构

 

  如此包装后,维护人员看到这样子的异常就有了初步的判断,或者检查配置,或者初始化环境,不需要直接到代码层级去分析了。

 

  3.解决Java异常机制自身的缺陷

 

  Java中的异常一次只能抛出一个,比如,doStuff方法有两个逻辑代码片段,如果在第一个逻辑片段中抛出异常,则第二个逻辑片段就不执行了,也就无法抛出第二个异常了。那么如何才能一次抛出两个异常呢?

 

  其实,使用自行封装的异常可以解决问题,代码如下:南京Java培训机构

 

  //容纳所有异常

 

  private List<Throwable> causes = new ArrayList<Throwable>();

 

  //构造函数,传递一个异常列表

 

  public MyException(List<? extends Throwable> _causes)

 

  cause.addAll(_causes);

 

  //读取所有的异常

 

  public List<Throwable> getException()


最近开班 more>
  • Web前端开发
  • 软件测试
  • 软件测试预科班
  • AI大模型+全栈开发开班
  • 云原生精英班
  • 云网预科班
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第五期
  • Java全栈
  • CISP
  • HCIP-cloud
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCP 19C
  • RHCA
  • 6月9日
  • 5月21日
  • 5月14日
  • 6月9日
  • 5月7日
  • 5月26日
  • 5月19日
  • 5月12日
  • 6月3日
  • 6月9日
  • 随时开课
  • 7月12日
  • 5月19日
  • 5月19日
  • 5月7日
  • 5月10日
  • 5月24日
  • 5月24日
  • 随时开课
  • 随时开课
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入