专栏首页Java编程技术Java中异常处理小细节

Java中异常处理小细节

一、前言

Java中异常分为两种:一种是基于Error的,一种是基于Exception的。其两者都是继承自Throwable;其中Error错误一般都是不可恢复的错误,比如系统崩溃、虚拟机错误,内存空间不足、类定义找不到、方法调用栈溢出等;而Exception错误则是我们经常使用来做业务异常拦截的;对于Error类型错误一般由于是不可恢复错误,所以没必要catch掉,但是凡事都有例外...

二、来龙去脉

如下代码,service()方法用来模拟业务服务,代码比较简单,一般下我们是首先创建一个返回对象,然后在try块中执行业务,然后设置结果;执行异常后在catch使用Exception类型捕获异常,然后设置result返回值为false。最后返回结果,这个代码看起来很正常:

public class Test {

    // 业务服务器提供的服务
    public static Result service() {

        // 1.创建返回对象
        Result result = new Result();
        result.setSucess(true);

        // 2.执行业务
        try {
            // 2.1执行业务,设置返回值 .....
            ...
            result.setData("ok");

        } catch (Exception e) {
            // 2.2比如业务异常则设置为false,并且返回异常信息
            result.setSucess(false);
            result.setCode("biz-error1");
        }
        // 3.返回结果
        return result;

    }

    public static void main(String[] args) throws InterruptedException, ClassNotFoundException {

        Executor executor = Executors.newFixedThreadPool(5);
        executor.execute(() -> {
            System.out.println(JSON.toJSONString(service()));
        });

        executor.shutdown();

    }
}

当service()服务在线程池里面执行时候,并且service()方法里面抛出NoClassDefFoundError异常后,我们会看不到System.out.println(JSON.toJSONString(service()));输出结果,也不知道异常NoClassDefFoundError跑到哪里去了,这非常不利于排查问题。

由于NoClassDefFoundError是继承自Error,而Error继承自Throwable,所以我们有必要在加一个catch块来捕获Throwable异常:

public static Result service() {

        // 1.创建返回对象
        Result result = new Result();
        result.setSucess(true);

        // 2.执行业务
        try {
            // 2.1执行业务,设置返回值 .....
            if (true) {
                throw new NoClassDefFoundError("calss def can not found");
            }

            result.setData("ok");

        } catch (Exception e) {
            // 2.2比如业务异常则设置为false,并且返回异常信息
            result.setSucess(false);
            result.setCode("biz-error1");
        } catch (Throwable e) {
            // 2.3比如不可恢复的异常,比如NoClassDefFoundError,则设置为false,并且返回异常信息
            result.setSucess(false);
            result.setCode("sys-error1");
            System.out.println(e.getLocalizedMessage());

        }

        // 3.返回结果
        return result;

    }

当然要想实现简单捕获线程中抛出的异常也可以实现UncaughtExceptionHandler来捕获。

三、总结

虽然Error类型的错误是不可恢复错误,但是有时候我们还是需要显示的捕获并打印日志,以便问题排查;另外比如NoClassDefFoundError类型错误,可以只是应用中部分服务不可用,但是其他模块服务是可用的,所以这时候我们还是要理会的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dubbo协议帧概述

    在TCP协议栈中,每层协议都有自己的协议报文格式,比如TCP协议是网络七层模型中的传输层,有TCP协议报文格式;在TCP上层是应用层,应用层协议常见的有http...

    加多
  • Dubbo剖析-整体架构分析

    工欲善其事,必先利其器,前面通过几篇文章简单的介绍了如何使用Dubbo搭建一个简单的分布式系统,在接下来的的一段时间就来研究Dubbo原理设计,本文作为原理设计...

    加多
  • Dubbo剖析-Dubbo协议

    TCP协议栈中,每层模型都有自己的协议报文格式,TCP协议是网络七层模型中的传输层,在TCP上层是应用层,应用层协议常见的有telnet等,Dubbo协议作为建...

    加多
  • Leetcode: Reverse Bits

    题目: Reverse bits of a given 32 bits unsigned integer.

    卡尔曼和玻尔兹曼谁曼
  • Laravel框架实现抢红包功能示例

    可以在信息界面自行选择 抢红包 或者 发红包 1.发红包,跳转到相应的发红包界面

    砸漏
  • AttributeError: 'list' object has no attribute 'keys'

    hankleo
  • 写一个 golang 风格的协程扩展

    Kotlin 的协程库 kotlinx.coroutines 当中有个比较常用的 async 函数,返回的 Deferred<T> 有个 await 方法,这个...

    bennyhuo
  • python学习(13)

    #coding=utf-8 result = [] for i in range(1,6): result.append(chr(97+i-1)+str(i))...

    py3study
  • python之操作redis

    py3study
  • Python自动化测试笔试面试题精选

    随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力。因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点。

    砸漏

扫码关注云+社区

领取腾讯云代金券