怎样在手机上做网站/优化落实疫情防控新十条

怎样在手机上做网站,优化落实疫情防控新十条,做特产的网站开张怎么宣传,应用程序开发<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

 <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头的异常处理。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。

二、Java 中的异常是啥构型?

Java 里头的异常,说白了就是程序运行时出的岔子。Java 的异常体系是“树形结构”,最顶上是 Throwable,往下分成 Error 和 Exception。Error 是那种严重的、没法儿处理的错误,比如说内存溢出啥的。Exception 是那种可以处理的异常,比如说空指针、数组越界啥的。

1. Exception 的分类

Exception 又分成两种:受检异常非受检异常

  • 受检异常:这种异常你得在代码里头显式处理,要么 try-catch,要么 throws。比如说 IOException,你要是读写文件,那得处理这个异常。
  • 非受检异常:这种异常不用显式处理,比如说 NullPointerException、ArrayIndexOutOfBoundsException,这些异常通常是代码写得不严谨导致的。

Java Code

// 受检异常示例

try {

    FileInputStream fis = new FileInputStream("file.txt");

} catch (IOException e) {

    e.printStackTrace();

}

// 非受检异常示例

String str = null;

System.out.println(str.length()); // 这里会抛出 NullPointerException

2. 异常之间的关系

Java 里头的异常是“继承关系”,子类异常可以捕获父类异常。比如说,IOException 是 Exception 的子类,你要是 catch 了 Exception,那 IOException 也能被捕获。

Java Code

try {

    // 一些可能抛出异常的代码

} catch (IOException e) {

    // 处理 IOException

} catch (Exception e) {

    // 处理其他 Exception

}

这段代码里头,IOException 会被第一个 catch 捕获,其他的 Exception 会被第二个 catch 捕获。

三、Spring Boot 中的全局异常处理

Spring Boot 里头有个 @ControllerAdvice 注解,专门用来做全局异常处理。你可以把它想象成一个“兜底的”,Controller 里头没处理的异常,它都能接住。

1. 全局异常处理示例

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        return new ResponseEntity<>("出错了:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

    }

}

这段代码里头,@ControllerAdvice 是用来定义一个全局的异常处理类,@ExceptionHandler 是用来处理特定类型的异常的。ResponseEntity 是用来返回 HTTP 响应的,里头可以带上状态码和响应体。

2. 处理特定异常

你可以针对不同的异常,写不同的处理方法。比如说,处理 NullPointerException 和 IllegalArgumentException。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)

    public ResponseEntity<String> handleNullPointerException(NullPointerException e) {

        return new ResponseEntity<>("空指针异常:" + e.getMessage(), HttpStatus.BAD_REQUEST);

    }

    @ExceptionHandler(IllegalArgumentException.class)

    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {

        return new ResponseEntity<>("参数不合法:" + e.getMessage(), HttpStatus.BAD_REQUEST);

    }

}

这段代码里头,NullPointerException 和 IllegalArgumentException 会被分别处理,返回不同的错误信息。

四、自定义异常

有时候,Java 自带的异常不够用,你得自己整一个。自定义异常很简单,继承 Exception 或者 RuntimeException 就行。

1. 自定义异常示例

Java Code

public class MyCustomException extends RuntimeException {

    public MyCustomException(String message) {

        super(message);

    }

}

这段代码里头,MyCustomException 是自定义异常,继承自 RuntimeException,所以它是非受检异常。

2. 使用自定义异常

你可以在代码里头抛出这个自定义异常。

Java Code

@RestController

@RequestMapping("/api")

public class MyController {

    @GetMapping("/test")

    public String test() {

        throw new MyCustomException("这是我的自定义异常");

    }

}

这段代码里头,test 方法会抛出 MyCustomException,然后被全局异常处理器捕获。

3. 处理自定义异常

你可以在全局异常处理器里头,专门处理这个自定义异常。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(MyCustomException.class)

    public ResponseEntity<String> handleMyCustomException(MyCustomException e) {

        return new ResponseEntity<>("自定义异常:" + e.getMessage(), HttpStatus.BAD_REQUEST);

    }

}

这段代码里头,MyCustomException 会被专门处理,返回自定义的错误信息。

五、异常的 AOP 处理

AOP(面向切面编程)是 Spring 里头的一个高级特性,可以用来在方法执行前后做一些额外的事情。异常处理也可以用 AOP 来做。

1. AOP 处理异常示例

Java Code

@Aspect

@Component

public class ExceptionAspect {

    @AfterThrowing(pointcut = "execution(* com.example.demo.controller.*.*(..))", throwing = "e")

    public void handleException(Exception e) {

        System.out.println("捕获到异常:" + e.getMessage());

    }

}

这段代码里头,@Aspect 是用来定义一个切面,@AfterThrowing 是用来在方法抛出异常后执行的。pointcut 是指定哪些方法需要被切面处理,throwing 是指定异常对象的变量名。

2. AOP 和全局异常处理的区别

AOP 和全局异常处理都可以用来处理异常,但它们的应用场景不一样。全局异常处理是用来处理 Controller 里头的异常,而 AOP 可以用来处理任何地方的异常,比如说 Service 层、DAO 层啥的。

六、Spring Boot 里头的异常处理坑点

1. 异常处理的顺序

Spring Boot 里头,异常处理的顺序很重要。你要是先 catch 了 Exception,那后面的 catch 就不起作用了。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        return new ResponseEntity<>("出错了:" + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);

    }

    @ExceptionHandler(NullPointerException.class)

    public ResponseEntity<String> handleNullPointerException(NullPointerException e) {

        return new ResponseEntity<>("空指针异常:" + e.getMessage(), HttpStatus.BAD_REQUEST);

    }

}

这段代码里头,NullPointerException 会被 handleException 捕获,handleNullPointerException 就不起作用了。

2. 异常信息的暴露

Spring Boot 里头,默认会把异常信息返回给客户端。你要是觉得这样不安全,可以把异常信息隐藏掉。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        return new ResponseEntity<>("出错了", HttpStatus.INTERNAL_SERVER_ERROR);

    }

}

这段代码里头,异常信息被隐藏了,客户端只能看到“出错了”。

3. 日志记录

异常处理里头,日志记录是个大事儿。你要是没记日志,那出了问题就抓瞎了。

Java Code

@ControllerAdvice

public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(Exception.class)

    public ResponseEntity<String> handleException(Exception e) {

        logger.error("捕获到异常:", e);

        return new ResponseEntity<>("出错了", HttpStatus.INTERNAL_SERVER_ERROR);

    }

}

这段代码里头,异常信息被记录到日志里头了,方便以后排查问题。

专有名词解释

  1. Throwable:Java 中所有错误和异常的基类。
  2. Error:Java 中表示严重错误的类,通常无法恢复。
  3. Exception:Java 中表示可恢复异常的类。
  4. 受检异常:必须在代码中显式处理的异常。
  5. 非受检异常:不需要显式处理的异常。
  6. ControllerAdvice:Spring 中用于定义全局异常处理类的注解。
  7. ExceptionHandler:Spring 中用于处理特定类型异常的注解。
  8. ResponseEntity:Spring 中用于封装 HTTP 响应的类。
  9. AOP:面向切面编程,一种编程范式,用于在方法执行前后做一些额外的事情。
  10. Aspect:Spring 中用于定义切面的注解。
  11. AfterThrowing:Spring 中用于在方法抛出异常后执行的注解。
  12. Logger:用于记录日志的工具类。

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

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

相关文章

moveit2基础教程上手-使用xarm6演示

0、前置信息 开发环境&#xff1a;wsl。 ros版本&#xff1a;jazzy&#xff0c;ubuntu版本&#xff1a;24.04 xarm-ros2地址 1、启动Rviz&#xff0c;加载 Motion Planning Plugin&#xff0c;实现演示功能 Getting Started — MoveIt Documentation: Rolling documentation…

第十六届蓝桥杯模拟二

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以实现将多个元素进行合成&#xff0c;实现特殊效果。AE的项目文件是aep&#xff0c;可以将素材、层、效果等一切信息&#xff0c;保存在这个项目文件中。 AE的原理&#xff0c;和PS的原理非常类似。 操作界面 操作界面如…

【React】基于自定义Hook提取公共逻辑

目录 自定义Hook自定义Hook 1自定义Hook 2使用 注意事项 自定义Hook 作用&#xff1a;提取封装一些公共的处理逻辑 玩法&#xff1a;创建一个函数&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在组件中调用这个方法&#xff01; 自定义Hook 1 页面加载的时候修改浏…

AUTOSAR与arxml的文档解析

如下是文档脑图 一、文档概述 该文档是 AUTOSAR 经典平台的应用接口用户指南&#xff0c;主要解释 **Al Table&#xff08;应用接口表&#xff09;** 的结构、方法论及相关技术细节&#xff0c;帮助开发者理解如何通过标准化接口实现软件组件的互操作性。 关键内容 目的&#…

油候插件、idea、VsCode插件推荐(自用)

开发软件&#xff1a; 之前的文章&#xff1a; 开发必装最实用工具软件与网站 推荐一下我使用的开发工具 目前在用的 油候插件 AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列 让查询变成多列&#xff0c;而且可以流式翻页 Github 增强 - 高速下载 github下载 TimerHo…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…

区块链开发技术公司:引领数字经济的创新力量

在数字化浪潮席卷全球的今天&#xff0c;区块链技术作为新兴技术的代表&#xff0c;正以其独特的去中心化、不可篡改和透明性等特点&#xff0c;深刻改变着各行各业的发展格局。区块链开发技术公司&#xff0c;作为这一领域的先锋和推动者&#xff0c;正不断研发创新&#xff0…

多条件排序(C# and Lua)

C# 升序排序 OrderBy 按升序对序列的元素进行排序 ThenBy 按升序对序列中的元素执行后续排序 降序排序 OrderByDescending 按降序对序列的元素排序 ThenByDescending 按降序对序列中的元素执行后续排序 public class Fruit {public int id;public string name;publi…

React19源码系列之Hooks(useId)

useId的介绍 https://zh-hans.react.dev/reference/react/useId useId 是 React 18 引入的一个新 Hook&#xff0c;主要用于生成全局唯一的 ID。在开发中&#xff0c;我们经常需要为元素&#xff08;如表单元素、模态框等&#xff09;生成唯一 ID&#xff0c;以便在 JavaScri…

Redisson 分布式锁原理

加锁原理 # 如果锁不存在 if (redis.call(exists, KEYS[1]) 0) then# hash结构,锁名称为key,线程唯一标识为itemKey&#xff0c;itemValue为一个计数器。支持相同客户端线程可重入,每次加锁计数器1.redis.call(hincrby, KEYS[1], ARGV[2], 1);# 设置过期时间redis.call(pexpi…

单元化架构在字节跳动的落地实践

资料来源&#xff1a;火山引擎-开发者社区 什么是单元化 单元化的核心理念是将业务按照某种维度划分成一个个单元&#xff0c; 理想情况下每个单元内部都是完成所有业务操作的自包含集合&#xff0c;能独立处理业务流程&#xff0c;各个单元均有其中一部分数据&#xff0c;所有…

基于Python的垃圾短信分类

垃圾短信分类 1 垃圾短信分类问题介绍 1.1 垃圾短信 随着移动互联科技的高速发展&#xff0c;信息技术在不断改变着我们的生活&#xff0c;让我们的生活更方便&#xff0c;其中移动通信技术己经在我们生活起到至关重要的作用&#xff0c;与我们每个人人息息相关。短信作为移…

leetcode1971.寻找图中是否存在路径

初尝并查集&#xff0c;直接套用模板 class Solution { private:vector<int> father;void init() {for(int i0;i<father.size();i)father[i]i;}int find(int v) {return vfather[v]?v:father[v]find(father[v]);//路径压缩}bool isSame(int u,int v){ufind(u);vfind…

QAI AppBuilder 快速上手(7):目标检测应用实例

YOLOv8_det是YOLO 系列目标检测模型&#xff0c;专为高效、准确地检测图像中的物体而设计。该模型通过引入新的功能和改进点&#xff0c;如因式分解卷积&#xff08;factorized convolutions&#xff09;和批量归一化&#xff08;batch normalization&#xff09;&#xff0c;在…

景联文科技:以高质量数据标注推动人工智能领域创新与发展

在当今这个由数据驱动的时代&#xff0c;高质量的数据标注对于推动机器学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域的发展具有不可替代的重要性。数据标注过程涉及对原始数据进行加工&#xff0c;通过标注特定对象的特征来生成能够被机器学习模型识别和使…

MySQL 索引下推

概念 索引下推&#xff08;Index Condition Pushdown&#xff0c;简称 ICP&#xff09; 是 MySQL 5.6 版本中提供的一项索引优化功能&#xff0c;它允许存储引擎在索引遍历过程中&#xff0c;执行部分 WHERE字句的判断条件&#xff0c;直接过滤掉不满足条件的记录&#xff0c;…