异常规范

编程

异常规范

后端异常规范

在开发使用中,异常应该能够很好地帮助我们定位到问题的所在。如果使用一种错误的方式,则bug很难被找到。

异常的分类

JAVA中有三种一般类型的可抛类: 检查性异常(checked exceptions)、非检查性异常(unchecked Exceptions)  错误(errors)。

1.Checked exceptions:必须通过方法进行声明。这些异常都继承自Exception类。一个Checked exception声明了一些预期可能发生的异常。

2.Unchecked exceptions:不需要声明的异常。大多继承自RuntimeException。例如NullPointerExceptionArrayOutOfBoundsException。同时这样的异常不应该捕获,而应该打印出堆栈信息。

3.Errors:大多是一些运行环境的问题,这些问题可能会导致系统无法运行。例如OutOfMemoryErrorStackOverflowError

用户自定义异常

我们应该遵循如下的规范。

1.当应用程序出现问题时,直接抛出自定义异常。

 

  1. thrownewDaoObjectNotFoundException("Couldn"t find dao with id "+ id);

2.将自定义异常中的原始异常包装并抛出。

 

  1. catch(NoSuchMethodException e){
  2. thrownewDaoObjectNotFoundException("Couldn"t find dao with id "+ id, e);
  3. }

错误的做法:

1.不要吞下catch的异常。

 

  1. try{
  2. System.out.println("Never do that!");
  3. }catch(AnyException exception){
  4. // Do nothing
  5. }

  • 这样的捕获毫无意义。我们应该使用一定的日志输出来定位到问题。
    2.方法上应该抛出具体的异常。而不是Exception

 

  1. publicvoid foo()throwsException{//错误方式
  2. }
  3. publicvoid foo()throwsSQLException{//正确方式
  4. }

3.要捕获异常的子类,而不是直接捕获Exception

 

  1. catch(Exception e){//错误方式
  2. }

4.永远不要捕获Throwable类。

5.不要只是抛出一个新的异常,而应该包含堆栈信息。错误的做法:

 

  1. try{
  2. // Do the logic
  3. }catch(BankAccountNotFoundException exception){
  4. thrownewBusinessException();
  5. // or
  6. thrownewBusinessException("Some information: "+ e.getMessage());
  7. }

 

  1. try{
  2. // Do the logic
  3. }catch(BankAccountNotFoundException exception){
  4. thrownewBusinessException(exception);
  5. // or
  6. thrownewBusinessException("Some information: ",exception);
  7. }

6.要么记录异常要么抛出异常,但不要一起执行。

 

  1. catch(NoSuchMethodException e){
  2. //错误方式
  3. LOGGER.error("Some information", e);
  4. throw e;
  5. }

7.不要在finally中再抛出异常。

 

  1. try{
  2. someMethod();//Throws exceptionOne
  3. }finally{
  4. cleanUp();//如果finally还抛出异常,那么exceptionOne将永远丢失
  5. }

  • 如果someMethod  cleanUp 都抛出异常,那么程序只会把第二个异常抛出来,原来的第一个异常(正确的原因)将永远丢失。
    8.始终只捕获实际可处理的异常。

 

  1. catch(NoSuchMethodException e){
  2. throw e;//避免这种情况,因为它没有任何帮助
  3. }

  • 不要为了捕捉异常而捕捉,只有在想要处理异常时才捕捉异常。
    9.不要使用printStackTrace()语句或类似的方法。

10.如果你不打算处理异常,请使用finally块而不是catch块。

11.应该尽快抛出(throw)异常,并尽可能晚地捕获(catch)它。你应该做两件事:分装你的异常在最外层进行捕获,并且处理异常。

12.在捕获异常之后,需要通过finally 进行收尾。在使用io或者数据库连接等,最终需要去关闭并释放它。

13.不要使用if-else 来控制异常的捕获。

14.一个异常只能包含在一个日志中。

 

  1. // 错误
  2. LOGGER.debug("Using cache sector A");
  3. LOGGER.debug("Using retry sector B");
  4.  
  5. // 正确
  6. LOGGER.debug("Using cache sector A, using retry sector B");

15.将所有相关信息尽可能地传递给异常。有用且信息丰富的异常消息和堆栈跟踪也非常重要。

16.在JavaDoc中记录应用程序中的所有异常。应该用javadoc来记录为什么定义这样一个异常。

17.异常应该有具体的层次结构。如果异常没有层次的话,则很难管理系统中异常的依赖关系。

类似这样

 

  1. classException{}
  2. classBusinessExceptionextendsException{}
  3. classAccountingExceptionextendsBusinessException{}
  4. classBillingCodeNotFoundExceptionextendsAccountingException{}
  5. classHumanResourcesExceptionextendsBusinessException{}
  6. classEmployeeNotFoundExceptionextendsHumanResourcesException{}

 

以上是 异常规范 的全部内容, 来源链接: utcz.com/z/519048.html

回到顶部