技术群里有朋友提问 “ 出现了三个会出现IOException异常的方法,是统一使用一个try/catch 进行捕获,还是分别进行捕获。”
@春少 和我的想法一致 如果不需要特殊处理统一处理即可。
但是我发现问题的核心是他日志打印的是e.getMessage,没有打印堆栈信息,导致无错误行数的提示。
然后误认为只有单独try catch才能更清楚地知道哪一行。
本文将介绍怎么解决这个问题,更重要的是这个问题对我们的沟通和学习的启发。
我见过的常见处理方法有以下几种
不处理就会报错,然后触发error日志的打印
将异常统一封装成前端可识别的信息,而不是直接500.
两种方式:
// 打印完整异常信息
log.error("xxx失败,e:{}", JSON.toJSONString(e));
// 只打印堆栈(推荐这一种)
log.error("xxx失败,e:{}", ExceptionUtils.getStackTrace(e));
一种是用fastjson的工具
一种是利用commons-lang3 工具类
org.apache.commons
commons-lang3
3.8.1
就此打住??no
虽然这个问题很简单,但是之前介绍过,《原 The more you think, the more you will learn》
我们要有不知足的心态,我们要有尽可能主动获取想要的知识的能力。 学习是一种能力,学习是一种习惯,学习是一种态度!
我们抓住这个学习的机会,既然这个问题暴露出我们对异常不够熟悉,为何不去趁机系统了解一下呢?
三、Learn More
去Exception类和Throwable类查看常见的属性和函数的含义。
具体自己去看。
源码版本:3.8.1
发现本质是调用了 java.lang.Throwable#printStackTrace(java.io.PrintWriter)函数
最后可以发现,提问者真正需要的并非自己问的问题。
因此提问者最好明确自己的问题是什么,最核心想要的是什么。
如果开始就明确“我想打印异常的行数,打印的都是错误的简要信息没有行数为啥?”,这个问题就简单明了了。
另外作为程序员,通过这个问题我们不仅要反思自己是否有类似的问题,思考自己是否能够说到问题的本质。
如果不能先想好再提问。
另外和别人交流的时候要搞清楚对方真正想要的是什么。尤其是和产品过需求的时候。
这是工作中交流的一种技能,而不仅仅是针对这个问题。
我们不要止步于知道答案,遇到困惑某种程度上是因为基础掌握的不够扎实。
我们要趁着这个几乎将这一块知识系统过一遍。
比如Json结构定义错了,说明对json的理解不够透彻;比如lombok的注解的效果和自己想的不一样,说明对lombok不够熟悉,可以趁机系统掌握一下。
我们开发过程中极少主动跟到源码里去学习和梳理为什么。这点主动性很重要,决定你是否可以学的更多,决定你进步的速度。
本文绝不仅仅是为了分享这个简单的问题,而是通过一个问题,讲述了沟通的艺术,学习的方法。
让大家可以从中学到更本质的东西,从中学到对工作和学习更有帮助的方法层面上。
本文尝试提供一种带有我个人理解的学习的模式,希望对大家有帮助。
创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。 另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。 https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。