java异常处理

最近在公司里写代码的时候也在考虑这个问题:到底该如何捕获异常,如何处理异常日志? 下面简要谈下个人的经验。以MVC框架为例,首先controller层必须捕获异常,一般情况下不允许将系统内部的异常不做任何封装处理直接抛给客户端,这样对系统来说会暴露过多信息(异常栈信息都抛给客户端,可能会把SQL结构都抛出去),这是不安全因素;同时,这对用户来说也是不友好的,让一些不搞计算机的同学看得一头雾水,并且怀疑网站的正规性与可靠性,可能会直接影响未来的业务。因此,通常需要在controller层封装一些错误码、用户友好语句(系统维护中等等欺骗用户的语句)。当然这也不是铁律,有的时候需要后台进行较检,可能需要抛出一些非公用的异常信息到界面上,比如之前车贷项目中用到过的上传附件检查,就是用后台异常提示用户的。还有就是传入参数有效性较检,也需要抛出自定义异常(用@NotNull或NotEmpty等注解抛出message信息),即不需要捕获后统一处理返回到用户界面。 接着说一下service层,业务层需要处理业务逻辑,当然这一层不需要考虑参数是否为空,需要考虑的仅仅是从dao查询相关的异常,比如ConnectionExcepion、SQLException、BadSQLGrammerException等异常,这些异常我通常会去捕获,因为这些异常涉及到业务逻辑是否能正常执行,确实是service该考虑的事。做法是try…catch…捕获所有Exception,然后在catch中用logger.error(“message, e = {}”, e.getMessage())记录日志信息,用于到时候定位error代码位置,然后根据实际业务情况,看这个异常捕获后是否需要用一个异常封装一下信息抛给控制层,然后由控制层统一处理也好或者直接返回给用户)。注意,业务层异常不是用于捕获NullPointerException等无聊的代码健壮性问题,这些都是业务层代码逻辑没控制好,查询值需要做一下非空判断。 至于dao层,我想没必要说了吧,一般我也不写实现类,持久层的mybatis3.X都用动态代理来实现了。 BTW,try…catch最好有针对性,不要把所有美容都放到try里面检查是否有异常,一般来说总有些无关异常的语句可以提到异常块之外,反正能提就提。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值