java异常处理和日志系统

java异常处理和日志规范

  • 异常规约

    service层的异常可以try{}catch(){},但是try后必须要显示的throw出去,这样才能被异常切面捕获,进而去处理异常。
    当有多层的try时,一定要每一级都要throw出去,而且不是最后一级的try{}catch(){}千万不要重新自定义异常
    最后一级的异常一定要用Exception来接,保证所有的异常都可以被接住处理掉(抛出或是记录日志,根据场景而定)

  • 异常切面处理

    当切面定义了两个异常捕获方法,并且捕获的异常类型都一样时,两个方法都会执行。
    在service的方法中throw出异常之后,先被aop异常处理,然后还会抛出给调用方,根据aop切面可以推断在调用service层的方法抛出异常之后,先被切面捕获,然后且切面处理完成后再抛出去,也就是说throw对切面和调用者都起了作用。
    AOP的AfterThrowing处理虽然可以对目标方法的异常进行处理,但这种处理与直接使用catch捕捉不同,catch捕捉意味着完全处理该异常,如果catch块中没有重新抛出新的异常,则该方法可能正常结束;而AfterThrowing处理虽然处理了该异常,但它不能完全处理异常,该异常依然会传播到上一级调用者,即JVM
    对于同一个jvm,如果切面切面拦截了方法的异常但是没有抛出,那么调用方捕获到的异常类型就是调用方法的异常类型,若果切面捕获到调用方法的异常并且重新抛出了,那么就是切面抛出的异常类型
    远程调用无论切面是否抛出异常,调用到的都是受检异常RunTimeException,只能通过继承受检异常然后将异常的堆栈信息传过来。

  • 异常处理的基本原则

    对于远程调用,当时业务方面的错误时,比如校验未通过,应该用error级别的日志记录,然后return终止或是返回。具体的判断交给远程调用者去处理。
    对于受检异常这些系统级别的异常,我们可以封装一个类似的ServiceException继承自RuntimeException,然后将失败的堆栈信息封装进去,抛出给切面捕获,切面也需要将该自定义异常的异常信息包装下抛出去,以使得程序终止,这样的话调用者需要捕获这类异常然后包装返回。
    不要使用ioe.printStackTrace();
    不要抛出异常后又输出日志;

你可能感兴趣的:(Java基础)