大佬教程收集整理的这篇文章主要介绍了【死磕 Java Core】 — 你以为异常就是 try…catch ?那你天真了,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
大家好c;我是大明哥。
我敢说对于很多小伙伴来说c;他们以为在 Java 中异常就是 try...catch
c;稍微有点儿意识的还会用下 throw new Exception
c;真的有这么简单吗?请宽恕小编直言c;你对 Java 异常一知半解。以下是小编对 Java 异常的理解c;如有错误之处c;请原谅c;资质有限。
先问一个问题c;在 Java 中c;你是赞同使用返回码还是异常来规范错误呢?
我先来说说使用返回码的情况c;比如登录逻辑c;我们分为如下几种情况:
使用返回码一般都是如下处理:
int code = userservice.login(userName,password);
if (code == 0) {
return "登录成功";
}else if (code == 1) {
return "用户名错误c;请重新输入";
}else if (code == 2) {
return "密码输入错误c;请重新输入";
} else if (code == 3) {
return "您是第一次登录c;请重置密码";
} else if (code == 4) {
return "您密码已连续输错 5 次c;冻结一天";
}
当然c;您可能有更加优雅的处理方式c;比如把 code 直接返回给前端c;让前端来根据返回码来展示不同的异常。如:
return userservice.login(userName,password);
这种后端处理方式确实是比较优雅c;但是前端呢?如果你后端再增加 5、6 种返回码c;你觉得你前端的同事不会打死你吗?
那怎么解决呢?
@H_304_197@可能有小伙伴说c;这种是前后端的交互c;那纯后端模式呢?一样应该使用异常。
如果你使用返回码来规范接口c;如:
那么别人在调用的写的方法时c;势必需要区分这几种情况c;比如 code = 0
怎么处理c;code = 1
怎么处理c;…c;刚刚开始他确实也是这样处理的c;而且处理地非常好c;你们程序运行也非常好c;但是某天c;你增加了一个 code = 5的c;然后你恰巧忘记告诉他了c;嗯c;上线后你就等着挨批吧。
其实这种单返回值还好处理c;如果是多返回值c;请问你怎么处理?如果返回的结果是一个 List 集合呢?你是不是得要构造一个 Map 或者对象c;别说你返回 null 哈c;否则我要敲你脑袋了。所以这种通过返回码的处理方式还是有一些问题的:
@H_304_197@大明哥c;在真实项目里面看到过这样处理的逻辑c;当时我一看c;菊花瞬间就紧了c;惊为天人啊。如下
public class serviceA {
public String @H_595_48@method1() {
doSomething1();
doSomething2();
if (a) {
return "false@xxxx";
} else if (b) {
return "false@zzzzz";
} else if (c) {
return "false@ccccc";
} else {
return "true@vvvvv";
}
}
}
调用方:
public class serviceB {
public void @H_595_48@method2() {
String result = @H_595_48@method1();
String[] results = result.split("@");
if ("false".equals(results[0])) {
if (results[1].contains("xxxx")) {
doSomething1();
}
if (results[1].contains("zzzzz")) {
doSomething2();
}
if (results[1].contains("ccccc")) {
doSomething3();
}
}
}
}
我就问你怕不怕?
在我看来通过返回码来判断程序的运行结果是否正确c;真的是一件吃力不讨好的事情。Java 提供了 try...catch
这么优雅的处理方式c;他难道不香吗?
可能有小伙会问c;你写的方法如果抛出了异常c;没有告诉其他同事c;是不是也会导致代码异常?我丢c;如果这个异常需要你同事做额外处理c;你不会抛出 checked Exception
么?
可能又有小伙伴说c;抛出异常会降低程序性能c;这个确实c;但是有考虑过一个问题没有c;我们系统大部分情况下都是正常运行c;只会偶尔抛出异常c;如果你写的程序一天到晚都在抛出异常c;你是不是需要思考下c;到底是你的问题还是程序的问题?同时c;丢失掉这么一点点性能换来的是高可读、易维护、优雅的代码难道不值得吗?
既然 Exception 有诸多好处c;那么我们应该怎么用好他呢?
我个人认为c;程序中的错误可以分为三大类:
对于这三种错误c;我们需要进行区分c;不同的异常分类有不同的处理级别。
同时c;我不建议系统中定义太多自定义 Exceptionc;有些小伙伴自定义 Exception 好像着魔了一样c;在系统中定义一大把 Exceptionc;如 UserNotFoundException
、UserpasswordErrorException
等等。目前我负责的系统中就只有如下几个异常:
BusinessException
:业务异常,继承 RuntimeExceptionNotFountexception
:业务异常,继承 RuntimeExceptionParamValidateException
:业务异常c;继承 RuntimeExceptionSystemException
:系统异常c;继承 Exception1、2、3 不需要显示处理c;4 一定需要处理。然后再配合两个枚举:
@H_304_197@BusinessErrorCodeEnum
SystemErrorCodeEnum
同时 BusinessException
c;构造函数中有一个 isPrintLog
参数c;用来判断是否需要打印 Error 日志c;对于一些不需要我们关注的 Exceptionc;统一传 false 即可。监控系统会每天将我们系统中所有的 Exception 通过邮件的方式发送给我们团队的每一个人c;我每天都会去关注前一天系统中的 Error 日志c;根据实际情况去掉一些不关注的 Exception。而且监控系统会实时将系统的 Error 、Exception 通过邮件和企业微信的方式告知相关的开发人员c;这样我们就能及时发现系统这个的错误c;及时响应c;缩小影响范围。
下面是耗子叔的异常最佳实践c;总结的非常好:
最后用一句总结今天的文章:异常应该出现在它应该出现的地方。
以上是大佬教程为你收集整理的【死磕 Java Core】 — 你以为异常就是 try…catch ?那你天真了全部内容,希望文章能够帮你解决【死磕 Java Core】 — 你以为异常就是 try…catch ?那你天真了所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。