java异常从业务层集中抛出,是不是每个控制层方法都要trycatch?
控制层中发生的异常有两种情况:
一种是意料之内的,可预估的。这种异常需要捕获异常后做出“尝试修复”,例如在查询用户信息rpc的过程中发生异常,包括什么500啊,404啊,这些对于客户端来说基本不用重试,可以通过清晰的错误码告知,相反,超时等情况则可以通知客户端稍后重试,通过不同的错误码引导客户端进行不同的操作。
另一种情况则是控制层本身就没考虑到的情况。这种情况盲目的try/catch没多大意义,通常会在框架层面做统一处理,包括记录异常信息,以及优雅的返回失败。
最后,对于try/catch的使用,我们不是并不是为了看不见异常,更多的是考虑我捕获后能做什么,能否尝试解决这个问题,如果不行,抛给上层,能否记录并告警,如果没考虑清楚这个问题,很容易犯一个大忌(吞掉异常)。
首先,,业务层,如果可控的要抛出。当然一定不要处理成错误的返回。也不是说一定要处理,看具体的处理场景,因为涉及到事物的问题,业务层还有一个重要的处理场景。那就是事务处理。如果你直接返回你的错误返回,那就是事务无效,正确的做法是。定义一个异常,再可控的异常try catch 抛出自定义异常,定义全局的异常处理器,利用异常处理器对自定义的错误返回系统标准返回?对于不可控的,可以在加上异常处理器。打注解实现http状态吗的返回
需要做统一异常处理,不能将异常返回给客户端,好的做法是最终到达客户端的是一个统一格式的result,要么succese,要么是fail,除了系统异常比如网络超时,500服务异常等。还必须有统一的状态码处理。
如何深入理解java异常处理机制?
Java的异常处理机制是Java语言的重要组成部分,要想理解Java异常处理机制就先要从Java异常处理的概念以及方式开始。在文章开始之前,我先给大家看一个程序:
如果你能清晰的描述出这个程序的运行结果,那么这篇文章就可以不用读了,否则就仔细的读一下。
Java异常的概念是程序在执行过程中遇到不可预见的错误,这个概念中有两点需要关注,一点是“程序在运行过程中”,这说明程序本身的语法是没有问题的,另一点是“不可预见的错误”,这就说明异常的产生具有一定的偶然性。
Java的异常处理方式有两个大的机制一个是try-catch机制,另一个是throws机制。try-catch机制简单的说就是捕获并处理异常,try-catch的用法非常灵活,既可以分层处理异常,也可以嵌套处理异常,看一个例子:
当try体中产生异常的时候,系统就会跳转到catch体进行异常处理,在这个例子中一个大的try-catch中还嵌套了一个小的try-catch体来单独处理一部分语句的异常,同时外部的try体还定义了两个catch体与之匹配,分别处理不同的异常。注意,在排列的时候要注意顺序,因为catch在处理异常的时候是就近匹配的,当程序匹配到一个catch体之后就不再继续往下匹配了,所以一定要把Exception异常放到后面,否则其他的catch体就起不到作用了。
接下来就要看一下throws和throw这两个关键字的作用了,简单的说throws是声明异常,而throw是抛出异常对象。看一个例子:
注意throws的位置在方法的声明处,而throw则在方法体内,throws后面跟的是异常的类型,而throw后面跟的则是异常的对象。注意在catch体内的throw语句虽然也会抛出一个异常,但是此处的异常并不会抛出到方法外部,这是一个需要注意的地方,看一个例子:
这个例子我们可以看到Foo方法并没有声明异常,程序依然可以运行,但是程序的第20行语句并不会得到执行,原因是程序在第11行由于throw e而退出了。
通常情况下,当一个方法声明异常时,所有调用这个方法的方法要么处理这个异常,要么继续声明,不能视而不见,简单的说,就是异常在传递的过程中不能无缘无故的消失,这是保证程序健壮性的一个非常重要的机制。
接下来就是自定义异常了,自定义异常有三个特点,分别是自己定义、自己抛出、自己处理,系统并不会抛出用户的自定义异常,看一个例子:
自定义异常在实际的使用中还是比较常见的。
当然,在使用try-catch的过程中还有一个重要的结构就是finally体,finally体的作用是无论try体是否有异常产生,finally体的内容都会得到执行,当然也有例外,看一个例子:
这个例子中在try体内调用了exit()方法,导致系统直接退出了,从而略过了fianlly体,这是一个需要注意的地方,通常情况下,finally体用于资源的回收处理。
接下来说一下断言(assert)的使用,在jdk1.4以后出现了断言,断言可以在程序中为程序员验证各种假设,可以说断言是对异常处理的一种辅助,看一个例子:
断言的使用在做测试的时候还是比较常见的。
虽然Java的异常处理看起来比较简单,但是要想把异常处理的机制搞清楚还是需要一个过程的,我使用Java的时间比较久,我在头条上也写了关于学习Java的系列文章,想学习Java的朋友可以关注我,相信一定会有所收获,如果有Java开发方面的问题,也可以咨询我。
谢谢!