异常处理相关心得

2024-09-04 01:52
文章标签 异常 处理 相关 心得

本文主要是介绍异常处理相关心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这段时间发现异常捕获是非常重要的一个机制,之前光埋头写代码了,如今想来,除了代码之外,解决问题的能力也是非常重要的,而如何解决问题,异常的捕获不可或缺

@RestControllerAdvice

@RestControllerAdvice 主要用于全局异常处理,它通常能够捕获由
@Controller、@RestController 标注的类中抛出的异常,并对其进行统一处理,意味着从线程池中抛出来的异常就不能被这个类捕获到了

给出一个简单的代码

@RestControllerAdvice
public class MyExceptionHandler {@ExceptionHandler(Exception.class)public String exceptionHandler(Exception e) {return "统一异常处理:" + e.getMessage();}
}

那么这个类能处理的异常就是在 controller 层面的异常,比如:

    @GetMapping("/initiative")public String test() {Date now = new Date();if (true) {throw new RuntimeException("主动抛出异常");}return "test";}//运行时异常--空指针异常/数组越界异常 等等@GetMapping("/runtime")public String runtime() {String str = null;return str.substring(0);}//受检异常--文件找不到异常 等等@GetMapping("/checked")public String checked() throws Exception {FileInputStream fis = new FileInputStream(new File("111datanew.xlsx"));return "checked";}

要注意,如果你 try catch 住了,就比如:

    //try-catch捕获异常@GetMapping("/trycatch")public String trycatch() {try {String str = null;String substring = str.substring(0);System.out.println("substring = " + substring);} catch (Exception e) {}return "trycatch2 请求成功";}

那么你收到的请求结果是 “trycatch2 请求成功”,而不是异常信息

线程池中的异常

实际上,线程池中的异常是比较难处理的一种异常,我们请求接口,然后接口中把一部分任务交给线程池,这通常是为了加快接口相应速度。一种是调用这个接口为的是开启一个任务,那么此时接口只需要封装一个任务交给线程池,然后直接返回 success 即可,另外一种是调整代码执行顺序,利用线程池,将一部分资源先准备好,等到后续用的时候可以更快的获取到。说白了就是,一种需要拿到返回值之后继续执行代码,最后返回success,一种不需要返回值,直接 success。

首先有一个线程池

@Configuration
public class ThreadPoolConfig {@Bean  //创建一个线程池public ThreadPoolExecutor myThreadPool() {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5,1L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());return executor;}
}

第一种,需要返回值的,那只能是 Callable

public class MyFuture implements Callable<String> {@Overridepublic String call() throws Exception {if (true) {Thread.sleep(1000);int i = 1 / 0;}return "线程池中的任务执行完成";}
}

需要注意的是,这里的 MyFuture 代码块中,并没有去 try catch,从而可以将异常带到controller层,使用@RestControllerAdvice进行捕获

    @GetMapping("/threadpool")public String threadpool() throws ExecutionException, InterruptedException {MyFuture myFuture = new MyFuture();FutureTask<String> futureTask = new FutureTask<>(myFuture);threadPoolExecutor.submit(futureTask);String s = futureTask.get();return "threadpool 请求成功";}

那么如果try catch了会怎么样呢?那自然RestControllerAdvice 就捕获不到,就会 return “threadpool 请求成功”;

第二种,不需要返回值的,那就可以是 Runnable

public class MyRunnable implements Runnable {@Overridepublic void run() {//像这么写,是不会在控制台打印出异常信息的,当然,我们可以将代码使用try-catch包裹起来,然后在catch中打印异常信息ArrayList<String> strings = new ArrayList<>();strings.add("1");strings.add("2");System.out.println(strings.get(3));}
}

不需要返回值的,如何捕获线程池中的异常?

    @GetMapping("/threadpool3")public String threadpool3() throws ExecutionException, InterruptedException {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.setUncaughtExceptionHandler((t, e) -> {System.out.println("线程池中的异常被捕获到了--2" + e.getMessage());//控制台打印异常信息});thread.start();return "threadpool-myRunnable 请求成功";//这里会被执行}

但是记住,不论是什么异常捕获机制,都有疏漏的地方,就比如最后一个例子,当我们请求 /threadpool3 的时候,得到了 threadpool-myRunnable 请求成功 这段话,就真的达到我们想要的目的了么?线程池里面的任务执行的如何了?失败的话,只是被打印出来的日志,没有人去看也没用,所以说,最好的方式还是捕获到异常之后,发送一条消息到 钉钉群,或者是微信群 这种方式最为稳妥。

没有人会点击一个接口之后,立马去看日志,当我们发现线程池中的任务执行失败的时候,很可能是1个小时以后的事情了,那个时候再去翻找日志太麻烦,所以说及时通知到群里才是最可靠的

这篇关于异常处理相关心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134666

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生