Spring Boot 异常处理

news2024/11/16 2:37:51

一、Spring Boot 异常处理的重要性

(一)确保应用稳定性

  1. 避免程序崩溃
    • 在应用程序运行过程中,可能会出现各种不可预见的错误和异常情况。如果没有有效的异常处理机制,这些异常可能会导致程序崩溃,影响用户体验和业务的正常运行。
  2. 提供友好的错误提示
    • 通过合理的异常处理,可以向用户提供友好的错误提示信息,让用户了解问题的大致情况,而不是看到一堆晦涩难懂的错误堆栈信息。

(二)便于故障排查

  1. 记录详细错误信息
    • 良好的异常处理机制可以记录详细的错误信息,包括异常类型、发生时间、错误堆栈等。这些信息对于开发人员进行故障排查非常有帮助,可以快速定位问题的根源。
  2. 提供统一的错误日志格式
    • 统一的错误日志格式可以使开发人员更容易分析和理解错误信息,提高故障排查的效率。

(三)提高代码可维护性

  1. 分离业务逻辑和错误处理逻辑
    • 将异常处理逻辑与业务逻辑分离,可以使代码更加清晰、易读和可维护。开发人员可以专注于业务逻辑的实现,而不必在每个业务方法中都编写繁琐的错误处理代码。
  2. 便于代码重构和扩展
    • 当业务逻辑发生变化时,独立的异常处理逻辑可以更容易地进行调整和扩展,而不会影响到业务逻辑的代码。

二、Spring Boot 中的异常类型

(一)运行时异常(RuntimeException)

  1. 特点和常见类型
    • 运行时异常是在程序运行过程中可能出现的异常,它们通常是由于程序的逻辑错误或不可预见的情况引起的。常见的运行时异常包括 NullPointerException(空指针异常)、IndexOutOfBoundsException(数组越界异常)、ArithmeticException(算术异常)等。
  2. 处理方式
    • 对于运行时异常,Spring Boot 通常会将其包装成一个通用的运行时异常(如 RuntimeException)并抛出。开发人员可以在控制器层或服务层捕获这些异常,并进行相应的处理。

(二)检查型异常(Checked Exception)

  1. 特点和常见类型
    • 检查型异常是在编译阶段就需要进行处理的异常,它们通常是由于外部资源的问题或程序的输入输出错误引起的。常见的检查型异常包括 IOException(输入输出异常)、SQLException(数据库操作异常)等。
  2. 处理方式
    • 对于检查型异常,开发人员需要在方法声明中明确抛出该异常,或者在方法内部进行捕获和处理。在 Spring Boot 中,可以使用 try-catch 块来捕获检查型异常,并进行相应的处理。

(三)自定义异常

  1. 定义和用途
    • 自定义异常是开发人员根据业务需求自定义的异常类型。它们可以用于表示特定的业务错误情况,使异常处理更加具有针对性和可读性。
  2. 继承关系和构造方法
    • 自定义异常通常继承自 Exception 类或 RuntimeException 类。在定义自定义异常时,可以提供多个构造方法,以便在不同的场景下创建异常对象,并传递相应的错误信息。

三、Spring Boot 异常处理的方式

(一)使用 @ControllerAdvice 和 @ExceptionHandler 注解

  1. 功能介绍
    • @ControllerAdvice 是一个 Spring 注解,用于定义一个全局的控制器增强类。在这个类中,可以使用 @ExceptionHandler 注解来处理特定类型的异常。
  2. 处理流程
    • 当控制器方法抛出一个异常时,Spring Boot 会查找是否有一个 @ControllerAdvice 类中定义了相应类型的 @ExceptionHandler 方法。如果找到,就会调用这个方法来处理异常,并返回一个适当的响应给客户端。
  3. 示例代码
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
        return new ResponseEntity<>("Null pointer exception occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(ArithmeticException.class)
    public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {
        return new ResponseEntity<>("Arithmetic exception occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

(二)实现 ErrorController 接口

  1. 功能介绍
    • ErrorController 是一个 Spring Boot 接口,用于处理应用程序中的错误情况。实现这个接口可以自定义错误页面和错误响应。
  2. 处理流程
    • 当应用程序发生错误时,Spring Boot 会调用 ErrorController 的实现类来处理错误。可以根据错误类型和状态码返回一个自定义的错误页面或错误响应。
  3. 示例代码
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CustomErrorController implements ErrorController {

    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping("/error")
    public ResponseEntity<String> handleError() {
        return new ResponseEntity<>("An error occurred. Please try again later.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

(三)使用 Spring AOP 进行异常处理

  1. 功能介绍
    • Spring AOP(Aspect-Oriented Programming)是一种面向切面编程的技术,可以在不修改业务代码的情况下,对业务方法进行增强。可以使用 AOP 来实现全局的异常处理。
  2. 处理流程
    • 通过定义一个切面类,使用 @Aspect 注解标注,并在其中定义一个方法,使用 @Around 注解来拦截业务方法的执行。在这个方法中,可以捕获业务方法抛出的异常,并进行相应的处理。
  3. 示例代码
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ExceptionHandlingAspect {

    @Around("execution(* com.example.service..*(..))")
    public Object handleException(ProceedingJoinPoint joinPoint) throws Throwable {
        try {
            return joinPoint.proceed();
        } catch (Exception ex) {
            return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}

四、自定义异常的处理

(一)定义自定义异常类

  1. 继承 Exception 或 RuntimeException
    • 自定义异常类通常继承自 Exception 类或 RuntimeException 类,具体取决于异常的性质。如果自定义异常是一个检查型异常,应该继承自 Exception 类;如果是一个运行时异常,可以继承自 RuntimeException 类。
  2. 添加属性和构造方法
    • 可以根据业务需求为自定义异常类添加属性,例如错误代码、错误消息等。同时,提供多个构造方法,以便在不同的场景下创建异常对象。
public class CustomBusinessException extends RuntimeException {

    private int errorCode;

    public CustomBusinessException(int errorCode, String message) {
        super(message);
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }
}

(二)在业务代码中抛出自定义异常

  1. 判断业务条件并抛出异常
    • 在业务方法中,根据业务逻辑判断是否出现错误情况。如果出现错误,可以抛出自定义异常,以便在异常处理层进行统一处理。
public class MyService {

    public void doSomething() {
        // 检查业务条件
        if (someConditionIsNotMet()) {
            throw new CustomBusinessException(1001, "Business condition not met.");
        }
    }
}

(三)在异常处理层处理自定义异常

  1. 使用 @ExceptionHandler 注解处理自定义异常
    • 在全局异常处理类中,可以使用 @ExceptionHandler 注解来处理自定义异常。根据异常的类型和属性,返回一个适当的响应给客户端。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomBusinessException.class)
    public ResponseEntity<String> handleCustomBusinessException(CustomBusinessException ex) {
        return new ResponseEntity<>("Custom business exception occurred: Error code " + ex.getErrorCode() + ", " + ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

五、Spring Boot 异常处理的最佳实践

(一)统一异常处理

  1. 定义全局异常处理类
    • 创建一个全局异常处理类,使用 @ControllerAdvice 注解标注。在这个类中,可以处理各种类型的异常,包括运行时异常、检查型异常和自定义异常。
  2. 提供统一的错误响应格式
    • 在全局异常处理类中,返回一个统一的错误响应格式,包括错误代码、错误消息和错误堆栈信息(可选)。这样可以使客户端更容易理解错误情况,并进行相应的处理。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        errorResponse.setErrorMessage(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    static class ErrorResponse {
        private int errorCode;
        private String errorMessage;

        public int getErrorCode() {
            return errorCode;
        }

        public void setErrorCode(int errorCode) {
            this.errorCode = errorCode;
        }

        public String getErrorMessage() {
            return errorMessage;
        }

        public void setErrorMessage(String errorMessage) {
            this.errorMessage = errorMessage;
        }
    }
}

(二)记录详细错误信息

  1. 使用日志框架记录错误
    • 在异常处理方法中,可以使用日志框架(如 Logback、Log4j2)记录详细的错误信息。包括异常类型、发生时间、错误消息和错误堆栈信息。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

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

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        logger.error("An exception occurred: {}", ex.getMessage(), ex);
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setErrorCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        errorResponse.setErrorMessage(ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    static class ErrorResponse {
        private int errorCode;
        private String errorMessage;

        public int getErrorCode() {
            return errorCode;
        }

        public void setErrorCode(int errorCode) {
            this.errorCode = errorCode;
        }

        public String getErrorMessage() {
            return errorMessage;
        }

        public void setErrorMessage(String errorMessage) {
            this.errorMessage = errorMessage;
        }
    }
}

  1. 将错误信息存储到数据库或日志文件中
    • 对于重要的应用程序,可以将错误信息存储到数据库或日志文件中,以便进行后续的分析和统计。可以使用 AOP 或自定义日志拦截器来实现将错误信息存储到数据库或日志文件中。

(三)提供友好的错误提示

  1. 根据不同的异常类型返回不同的错误提示
    • 在异常处理方法中,可以根据异常的类型返回不同的错误提示信息。例如,对于数据库操作异常,可以返回 “数据库操作失败,请稍后再试”;对于网络连接异常,可以返回 “网络连接异常,请检查网络设置”。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SQLException.class)
    public ResponseEntity<String> handleSQLException(SQLException ex) {
        return new ResponseEntity<>("Database operation failed. Please try again later.", HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(IOException.class)
    public ResponseEntity<String> handleIOException(IOException ex) {
        return new ResponseEntity<>("Network connection exception. Please check your network settings.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

  1. 在前端展示友好的错误提示
    • 在前端页面中,可以根据后端返回的错误提示信息,展示友好的错误提示给用户。可以使用 JavaScript 或前端框架(如 Vue.js、React)来实现友好的错误提示展示。

六、实际案例分析

(一)案例背景

假设有一个电商应用程序,用户可以在该应用程序中浏览商品、添加商品到购物车、下单等。在应用程序的开发过程中,需要考虑各种异常情况的处理,以确保应用程序的稳定性和用户体验。

(二)技术选型

  1. 使用 Spring Boot 框架
    • 选择 Spring Boot 作为开发框架,因为它提供了丰富的功能和便捷的开发方式。Spring Boot 的自动配置和起步依赖使得应用程序的开发更加高效。
  2. 结合数据库和缓存技术
    • 使用关系型数据库(如 MySQL)来存储商品信息、用户信息和订单信息等。同时,使用缓存技术(如 Redis)来提高应用程序的性能。
  3. 采用前后端分离架构
    • 采用前后端分离架构,前端使用 Vue.js 或 React 等前端框架,后端使用 Spring Boot 提供 RESTful API。这样可以提高开发效率,便于团队协作和维护。

(三)异常处理的具体实现

  1. 定义自定义异常类
    • 根据业务需求,定义了一些自定义异常类,如 ProductNotFoundException(商品未找到异常)、CartItemLimitExceededException(购物车商品数量超过限制异常)、OrderCreationFailedException(订单创建失败异常)等。
public class ProductNotFoundException extends RuntimeException {

    public ProductNotFoundException(String message) {
        super(message);
    }
}

public class CartItemLimitExceededException extends RuntimeException {

    public CartItemLimitExceededException(String message) {
        super(message);
    }
}

public class OrderCreationFailedException extends RuntimeException {

    public OrderCreationFailedException(String message) {
        super(message);
    }
}
  1. 在业务代码中抛出自定义异常
    • 在商品服务类、购物车服务类和订单服务类中,根据业务逻辑判断是否出现错误情况。如果出现错误,抛出相应的自定义异常。

import com.example.exception.ProductNotFoundException;

public class ProductService {

    public Product findProductById(Long productId) {
        // 模拟从数据库中查找商品
        if (productId == null || productId <= 0) {
            throw new ProductNotFoundException("Product not found.");
        }
        // 返回商品对象
        return new Product(productId, "Product Name", 100.0);
    }
}
import com.example.exception.CartItemLimitExceededException;

public class CartService {

    private static final int MAX_CART_ITEMS = 10;

    public void addItemToCart(Long productId) {
        // 模拟购物车操作
        if (getCartItemCount() >= MAX_CART_ITEMS) {
            throw new CartItemLimitExceededException("Cart item limit exceeded.");
        }
        // 添加商品到购物车
    }

    private int getCartItemCount() {
        // 返回购物车中商品的数量
        return 5;
    }
}

import com.example.exception.OrderCreationFailedException;

public class OrderService {

    public void createOrder() {
        // 模拟订单创建过程
        if (someConditionIsNotMet()) {
            throw new OrderCreationFailedException("Order creation failed.");
        }
        // 创建订单
    }
}

  1. 在全局异常处理类中处理自定义异常
    • 创建一个全局异常处理类,使用 @ControllerAdvice 注解标注。在这个类中,使用 @ExceptionHandler 注解来处理自定义异常,并返回一个适当的响应给客户端。
import com.example.exception.CartItemLimitExceededException;
import com.example.exception.OrderCreationFailedException;
import com.example.exception.ProductNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<String> handleProductNotFoundException(ProductNotFoundException ex) {
        return new ResponseEntity<>("Product not found. Please check the product ID.", HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(CartItemLimitExceededException.class)
    public ResponseEntity<String> handleCartItemLimitExceededException(CartItemLimitExceededException ex) {
        return new ResponseEntity<>("Cart item limit exceeded. You cannot add more items to the cart.", HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(OrderCreationFailedException.class)
    public ResponseEntity<String> handleOrderCreationFailedException(OrderCreationFailedException ex) {
        return new ResponseEntity<>("Order creation failed. Please try again later or contact customer support.", HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

(四)效果评估

  1. 提高应用程序的稳定性
    • 通过合理的异常处理机制,能够及时捕获和处理各种异常情况,避免了程序的崩溃,提高了应用程序的稳定性。
  2. 改善用户体验
    • 向用户提供了友好的错误提示信息,让用户了解问题的大致情况,减少了用户的困惑和不满,改善了用户体验。
  3. 便于故障排查
    • 记录了详细的错误信息,包括异常类型、发生时间、错误消息和错误堆栈等。这些信息对于开发人员进行故障排查非常有帮助,可以快速定位问题的根源。

七、总结与展望

Spring Boot 异常处理是构建健壮应用程序的关键策略之一。通过合理地处理各种异常情况,可以提高应用程序的稳定性、用户体验和可维护性。在实际应用中,我们可以根据具体的业务需求和技术选型,选择合适的异常处理方式,并遵循最佳实践,以确保应用程序的质量和可靠性。

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

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

相关文章

【ubuntu16.04】机器人学习笔记遇到的问题及解决办法:仿真小海龟

18版本的后面会出问题&#xff0c;避免万一我还是用了之前的16版本&#xff0c;虽然还没有解决粘贴的问题&#xff0c;但是安装ros很成功 可参考该文章博主讲的很详细&#xff0c;成功画出海龟 最后要把鼠标停在第三个终端&#xff0c;再去点击键盘&#xff0c;海龟才会动哦

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据&#xff0c;改播放正弦波 下面主要讲关于浮点数 1. char&#xff08;字符类型&#xff09; 大小&#xff1a;1 字节&#xff08;8 位&#xff09;表示方式&#xff1a;char 存储的是一个字符的 A…

探索 JNI - Rust 与 Java 互调实战

真正的救赎&#xff0c;并非厮杀后的胜利&#xff0c;而是能在苦难之中&#xff0c;找到生的力量和内心的安宁。 ——加缪Albert Camus 一、Rust Java &#xff1f; Java 和 Rust 是两种现代编程语言&#xff0c;各自具有独特的优势&#xff0c;适用于不同的应用场景。 1、…

C++11新特性(二)

目录 一、C11的{} 1.初始化列表 2.initializer_list 二、可变参数模版 1.语法与原理 2.包扩展 3.empalce接口 三、新的类功能 四、lambda 1.语法 2.捕捉列表 3.原理 五、句装器 1.function 2.bind 一、C11的{} 1.初始化列表 C11以后想统⼀初始化⽅式&#xff0…

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)

前置环境 macOS系统&#xff0c;已安装homebrew且会相关命令。 近期在整理草稿区&#xff0c;所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址&#xff1a;https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…

Vue3集成搜索引擎智能提示API

需求&#xff1a; 如何在项目中实现像百度搜索框一样的智能提示效果&#xff0c;如下图所示&#xff1a; 相关知识&#xff1a; 下面是各厂商提供的免费API 厂商请求百度http://suggestion.baidu.com/su?wd中国&cbwindow.baidu.sug必应http://api.bing.com/qsonhs.as…

大数据技术在智慧医疗中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 引言 大数据技术概述 定义与原理 发…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS&#xff08;读取时间戳计数器&#xff09;指令是 x86/x86_64 架构中的…

「QT」文件类 之 QTemporaryDir 临时目录类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

Kettle配置数据源错误“Driver class ‘org.gjt.mm.mysql.Driver‘ could not be found”解决记录

问题描述 错误提示&#xff1a;“Driver class ‘org.gjt.mm.mysql.Driver’ could not be found, make sure the ‘MySQL’ driver (jar file) is installed.” 原因分析&#xff1a; 根据错误提示是缺少了相关的数据源连接jar包。 解决方案&#xff1a; 安装对应的Mysql…

C++《继承》

在之前学习学习C类和对象时我们就初步了解到了C当中有三大特性&#xff0c;分别是封装、继承、多态&#xff0c;通过之前的学习我们已经了解了C的封装特性&#xff0c;那么接下来我们将继续学习另外的两大特性&#xff0c;在此将分为两个章节来分别讲解继承和多态。本篇就先来学…

力扣(LeetCode)283. 移动零(Java)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:雾失楼台&#xff0c;月迷津渡&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主…

运算放大器的学习(一)输入阻抗

输入阻抗 最近需要对运算放大器进行学习&#xff0c;我们后面逐一对其参数进行了解。 首先了解下输入阻抗。 放大电路技术指标测试示意图&#xff1a; 输入电阻&#xff1a; 从放大电路的输入端看进去的等效电阻称为放大电路的输入电阻&#xff0c;如上图&#xff0c;此处考虑…

Python3.11.9下载和安装

一、Python3.11.9下载和安装 1、下载 下载地址&#xff1a;https://www.python.org/downloads/windows/ 选择版本下载&#xff0c;例如&#xff1a;Python 3.11.9 - April 2, 2024 2、安装 双击exe安装 3、配置环境变量 pathD:\Program Files\python3.11.9 pathD:\Progr…

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载

随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合&#xff0c;AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革&#xff0c;在投入提升与政策扶植的双重作用下&#xff0c;以大模型技术为底座、结合专业化金融能力的金融大…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

Vue3 -- 环境变量的配置【项目集成3】

环境&#xff1a; 在项目开发过程中&#xff0c;至少会经历开发环境、测试环境和生产环境(即正式环境)三个阶段。 开发环境 .env.development测试环境 .env.test生产环境 .env.production 不同阶段请求的状态(如接口地址等)不一样&#xff0c;开发项目的时候要经常配置代理跨…

vxe-table 分享实现无限滚动行方式

Vxe UI vue vxe-table 分享无限滚动行方式 实现无限滚动加载有多种方式&#xff0c;可以使用 scroll 事件&#xff0c;也可以使用 scroll-boundary 事件&#xff0c;能满足不同的需求场景。 以下是分享使用 scroll-boundary 事件的用法。 原理 通过 scrollY.threshold 设置阈…

C++中的栈(Stack)和堆(Heap)

在C中&#xff0c;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;是两种用于存储数据的内存区域。理解它们的原理和区别&#xff0c;对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析&#xff0c;包括它们的分配方式、优缺点、应用场…

outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务

微软邮箱反垃圾已经很强大了非常敏感&#xff0c;自家的域名的邮件都能给扔到垃圾邮箱里&#xff0c;但还是在本地增加了一层垃圾邮箱功能&#xff0c;然后垃圾邮箱并没有提示&#xff0c;导致错过很多通知&#xff0c;本身并没有提供关闭的功能&#xff0c;但微软有个Microsof…