Java中的异常处理与容错设计最佳实践

Java中的异常处理与容错设计最佳实践

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

在Java编程中,异常处理是一个非常重要的环节。良好的异常处理和容错设计可以提升系统的健壮性和可维护性。本文将介绍Java中的异常处理与容错设计最佳实践,包括异常的分类、捕获与处理、日志记录、以及自定义异常的设计等。

异常的分类

Java中的异常主要分为两类:检查异常(Checked Exception)和运行时异常(Runtime Exception)。检查异常需要在代码中显式处理,而运行时异常则是在程序运行过程中抛出的,不需要显式声明。

  • 检查异常:例如IOExceptionSQLException等,需要在方法签名中用throws声明。
  • 运行时异常:例如NullPointerExceptionArrayIndexOutOfBoundsException等,是程序逻辑错误或无法预见的异常。

捕获与处理异常

捕获异常使用try-catch语句。合理的异常捕获和处理可以防止程序崩溃,并提供有意义的错误信息。

package cn.juwatech.exceptionhandling;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class FileProcessor {public void processFile(String filePath) {BufferedReader reader = null;try {reader = new BufferedReader(new FileReader(filePath));String line;while ((line = reader.readLine()) != null) {// 处理文件内容System.out.println(line);}} catch (IOException e) {// 记录日志并处理异常System.err.println("Error reading file: " + e.getMessage());} finally {try {if (reader != null) {reader.close();}} catch (IOException e) {System.err.println("Error closing reader: " + e.getMessage());}}}
}

在上面的例子中,我们使用try-catch-finally结构来确保资源的正确关闭,并在异常发生时记录日志。

日志记录

在处理异常时,记录日志是非常重要的。通过日志,我们可以了解系统运行的状况以及异常发生的原因。常用的日志记录框架有Log4jSLF4J等。

package cn.juwatech.exceptionhandling;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class FileProcessorWithLogging {private static final Logger logger = LoggerFactory.getLogger(FileProcessorWithLogging.class);public void processFile(String filePath) {BufferedReader reader = null;try {reader = new BufferedReader(new FileReader(filePath));String line;while ((line = reader.readLine()) != null) {// 处理文件内容System.out.println(line);}} catch (IOException e) {logger.error("Error reading file: {}", filePath, e);} finally {try {if (reader != null) {reader.close();}} catch (IOException e) {logger.error("Error closing reader for file: {}", filePath, e);}}}
}

使用SLF4J记录日志,可以更灵活地配置和管理日志输出。

自定义异常

在实际开发中,我们经常需要定义自己的异常类型,以便更清晰地描述业务逻辑中的错误。自定义异常通常继承自ExceptionRuntimeException

package cn.juwatech.exceptionhandling;public class InvalidUserInputException extends Exception {public InvalidUserInputException(String message) {super(message);}public InvalidUserInputException(String message, Throwable cause) {super(message, cause);}
}

使用自定义异常可以让代码更具可读性,并且有助于异常的统一管理。

容错设计

在分布式系统中,容错设计是非常重要的。通过合理的容错机制,可以提高系统的可用性和可靠性。常见的容错设计包括重试机制、降级处理、熔断机制等。

重试机制

在网络请求失败时,重试机制可以增加成功的几率。以下是一个简单的重试示例:

package cn.juwatech.faulttolerance;import java.net.HttpURLConnection;
import java.net.URL;public class RetryMechanism {private static final int MAX_RETRIES = 3;public void fetchDataFromService(String serviceUrl) {int attempts = 0;while (attempts < MAX_RETRIES) {try {URL url = new URL(serviceUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");if (connection.getResponseCode() == 200) {// 处理响应System.out.println("Data fetched successfully");break;}} catch (Exception e) {attempts++;if (attempts >= MAX_RETRIES) {System.err.println("Failed to fetch data after " + MAX_RETRIES + " attempts");}}}}
}

降级处理

在系统负载过高或服务不可用时,降级处理可以保证核心功能的正常运行。

package cn.juwatech.faulttolerance;public class FallbackMechanism {public String fetchDataWithFallback(String serviceUrl) {try {// 尝试从服务获取数据return fetchDataFromService(serviceUrl);} catch (Exception e) {// 发生异常时返回降级数据return "Fallback data";}}private String fetchDataFromService(String serviceUrl) throws Exception {// 模拟网络请求throw new Exception("Service not available");}
}

熔断机制

熔断机制可以防止系统在高负载情况下的雪崩效应。常用的熔断框架有Hystrix、Resilience4j等。

package cn.juwatech.faulttolerance;import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.vavr.control.Try;import java.time.Duration;public class CircuitBreakerExample {private CircuitBreaker circuitBreaker;public CircuitBreakerExample() {CircuitBreakerConfig config = CircuitBreakerConfig.custom().failureRateThreshold(50).waitDurationInOpenState(Duration.ofSeconds(10)).build();this.circuitBreaker = CircuitBreaker.of("example", config);}public String fetchDataWithCircuitBreaker(String serviceUrl) {return Try.ofSupplier(CircuitBreaker.decorateSupplier(circuitBreaker, () -> fetchDataFromService(serviceUrl))).recover(throwable -> "Fallback data").get();}private String fetchDataFromService(String serviceUrl) throws Exception {// 模拟网络请求throw new Exception("Service not available");}
}

结论

通过本文的介绍,我们了解了Java中异常处理与容错设计的最佳实践,包括异常分类、捕获与处理、日志记录、自定义异常以及容错设计的重试机制、降级处理和熔断机制。这些最佳实践可以帮助我们编写更健壮、更易维护的Java应用程序。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【接口测试】params传参与body传参区别

文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例&#xff1a; http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…

【java基础】spring springMVC springboot 的区别

Spring, Spring MVC, 和 Spring Boot 是三个紧密相关的技术&#xff0c;它们都是由 Pivotal 团队&#xff08;原SpringSource&#xff09;开发的&#xff0c;主要用于构建企业级的Java应用程序。尽管它们在功能上有所交集&#xff0c;但各自也有独特的定位和用途。 Spring Fra…

Linux定时执行程序和关闭程序

cron是一个基于时间的作业调度器&#xff0c;可以在指定的时间运行命令。 打开终端并编辑cron任务 crontab -e定时任务 # 每天20点30分执行程序 30 20 * * * /home/user/my_program # 每天15点30分关闭程序 30 15 * * * pkill my_programcrontab 用法 crontab 是 Unix 和类…

MacOS安装SDKMan管理Java版本

文章目录 1 简介2 安装与卸载2.1 安装2.2 卸载 3 使用3.1 查看其他工具&#xff1a;支持 Ant, Maven 等3.2 查看Java版本3.3 安装Java&#xff0c;加上相关的版本3.4 设置Java版本(全局)3.5 只在当前窗口生效3.6 卸载1 默认环境无法卸载 4 jdk安装的位置5 与IDEA集成参考 1 简介…

简单修改,让UE4/5着色器编译速度变快

简单修改&#xff0c;让UE4/5着色器编译速度变快 目录 简单修改&#xff0c;让UE4/5着色器编译速度变快 一、问题描述 二、解决方法 &#xff08;一&#xff09;硬件升级 &#xff08;二&#xff09;调整相关设置和提升优先级 1.调整相关设置 &#xff08;1&#xff09…

Pytorch 6

罗切斯特回归模型 加了激活函数 加了激活函数之后类 class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear torch.nn.Linear(1,1)def forward(self, x):# y_pred F.sigmoid(self.linear(x))y_p…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

Angular之store全局状态管理 浅学

在 Angular 应用中&#xff0c;我们可以使用 ngrx/store 进行状态管理可以有效地管理和跟踪应用程序的状态变化。ngrx/store 是基于 Redux 模式的状态管理库&#xff0c;它提供了一种集中式存储管理应用程序状态的方式。以下是关于 ngrx/store 的详细解释和使用方法&#xff1a…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…

智能制造·数字化工厂建设规划方案(65P)

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图

Ecovadis评估的流程是什么

Ecovadis评估流程是一个全面、系统且注重细节的过程&#xff0c;旨在为企业提供关于其可持续性表现的深入洞察。这一评估不仅覆盖了企业在环境、社会和治理方面的多个方面&#xff0c;还强调了持续改进的重要性&#xff0c;确保企业能够不断提升其CSR&#xff08;企业社会责任&…

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义 DSL语句 #实例 GET /capture_features_202407/_search {"query": {"bool": {"must": [{"terms": {"plateNo": ["汉A00001"]}},{"range&quo…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

Qt创建自定义组件并且promote to之后导致编译错误(CMake)

创建自定组件并且加入到全局(勾选"Global include"选项)后&#xff0c;重新编译&#xff0c;元对象编译器生成的ui_xxxx.h文件中会新加入自定义组件的头文件&#xff1a; 如图所示&#xff0c;编译器提示找不到自定义组件的头文件&#xff1a; Solution: 在CMakeL…

Java开发之LinkedList源码分析

#来自ゾフィー&#xff08;佐菲&#xff09; 1 简介 LinkedList 的底层数据结构是双向链表。可以当作链表、栈、队列、双端队列来使用。有以下特点&#xff1a; 在插入或删除数据时&#xff0c;性能好&#xff1b;允许有 null 值&#xff1b;查询效率不高&#xff1b;线程不安…

opencascade AIS_InteractiveContext源码学习9 obsolete methods

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

Leetcode3216. 交换后字典序最小的字符串

Every day a Leetcode 题目来源&#xff1a;3216. 交换后字典序最小的字符串 解法1&#xff1a;模拟 找到第一个 s[i] > s[i 1]&#xff0c;且它们奇偶性相同&#xff0c;交换它们。 代码&#xff1a; /** lc appleetcode.cn id3216 langcpp** [3216] 交换后字典序最小…

Python群体趋向性潜关联有向无向多图层算法

&#x1f3af;要点 &#x1f3af;算法模型图层节点和边数学定义 | &#x1f3af;算法应用于贝叶斯推理或最大似然优化概率建模的多图层生成模型 | &#x1f3af;算法结合图结构边和节点属性 | &#x1f3af;对比群体关联预测推理生成式期望最大化多图层算法 | &#x1f3af;使…

【故障排除】Unity在编辑器模式下Play时闪退

一开始以为是偶然的情况&#xff0c;但逐渐发现了规律&#xff1a; 每次某个角色释放技能的时候就会闪退。 为了找到问题代码&#xff0c;找了一下存放运行Log的文件夹&#xff1a; 打开 Console 窗口&#xff08;菜单&#xff1a;Window > General > Console&#xff…

[Jenkins]jenkins-cli.jar调用用户token启动任务

背景&#xff1a;项目入了一群od伙伴&#xff0c;但是od伙伴有单独的构建工程需要提交&#xff0c;由于jenkins的版本太拉闸&#xff0c;不能配置根据role和项目分权限&#xff0c;插件安装失败&#xff0c;不得已想到一个办法。让OD伙伴&#xff0c;在本地&#xff0c;用java&…