Java Web開發進階——錯誤處理與日志管理

錯誤處理和日志管理是任何生產環境中不可或缺的一部分。在 Spring Boot 中,合理的錯誤處理機制不僅能夠提升用戶體驗,還能幫助開發者快速定位問題;而有效的日志管理能夠幫助團隊監控應用運行狀態,及時發現和解決問題。


1. 常見錯誤類型與處理機制
1.1 常見錯誤類型

在開發應用過程中,我們可能會遇到多種錯誤,常見的錯誤類型包括:

  • 運行時異常(RuntimeException):這種異常通常由程序中的邏輯錯誤導致,如空指針異常(NullPointerException)、數組下標越界(ArrayIndexOutOfBoundsException)等。
  • 受檢異常(Checked Exception):這類異常通常是由外部因素引起的,如文件找不到(FileNotFoundException)、數據庫連接失敗(SQLException)等。開發者需要顯式處理這類異常,或者通過 throws 拋出。
  • 錯誤(Error):通常表示虛擬機級別的錯誤,例如內存溢出(OutOfMemoryError)或棧溢出(StackOverflowError)等。
1.2 異常處理機制

在 Spring Boot 中,異常可以通過多種方式進行處理。常用的異常處理機制包括:

  • 局部異常處理:在方法中使用 try-catch 語句捕獲并處理異常。這適用于一些局部的、不可避免的錯誤處理。
  • 全局異常處理:使用全局異常處理器(例如 @ControllerAdvice@ExceptionHandler)來統一處理不同類型的異常。這種方式適用于應用中需要統一處理異常的場景,簡化了代碼,增強了可維護性。

2. 全局異常處理與 @ResponseStatus
2.1 全局異常處理

Spring 提供了 @ControllerAdvice 注解,使我們能夠將異常處理代碼與業務邏輯分離,實現全局異常處理。@ControllerAdvice 類可以用來定義一個全局異常處理器,在捕獲到異常時返回自定義的響應結果。

一個簡單的全局異常處理示例如下:

import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {// 處理所有類型的異常@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public String handleException(Exception e, Model model) {model.addAttribute("error", e.getMessage());return "error";}// 處理特定的異常類型@ExceptionHandler(NullPointerException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public String handleNullPointerException(NullPointerException e, Model model) {model.addAttribute("error", "Null Pointer Exception occurred");return "error";}
}

在上面的代碼中,@ControllerAdvice 用來處理全局異常,@ExceptionHandler 用來指定處理特定異常的方法。@ResponseStatus 注解用于指定異常的 HTTP 響應狀態碼。

2.2 使用 @ResponseStatus 注解

@ResponseStatus 注解用于將異常與 HTTP 狀態碼綁定,可以方便地為特定的異常分配狀態碼,并自動返回對應的錯誤響應。

例如:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

ResourceNotFoundException 被拋出時,Spring 會自動將響應的狀態碼設置為 404 Not Found,并將異常消息作為響應體返回。

在實際應用中,我們可以通過 @ResponseStatus 為不同的異常類型指定不同的 HTTP 狀態碼,確保客戶端可以獲得更明確的錯誤信息。

2.3 其他常見異常處理機制
  • 自定義異常:我們可以定義自定義異常類,用于封裝業務邏輯中的錯誤。例如:
public class BusinessException extends RuntimeException {public BusinessException(String message) {super(message);}
}

然后在全局異常處理類中處理這些自定義異常,返回自定義的錯誤消息。

  • RestController 異常處理:在 RESTful 風格的 Web 應用中,通常使用 @RestControllerAdvice 來集中管理異常。與 @ControllerAdvice 類似,它也可以捕獲并處理應用中的異常,只不過它返回的是 JSON 格式的錯誤響應。
@RestControllerAdvice
public class GlobalRestExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse("Resource Not Found", ex.getMessage());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}
}

3. 使用SLF4J與Logback進行日志管理
3.1 SLF4J簡介

SLF4J(Simple Logging Facade for Java)是一個日志門面,它為不同的日志系統(如 Log4j、Logback、JUL 等)提供統一的接口。SLF4J 本身不提供日志實現,它只提供 API,實際的日志輸出是由底層實現(如 Logback)完成的。

在 Spring Boot 中,SLF4J 與 Logback 默認集成,因此我們可以直接使用 SLF4J API 進行日志記錄。

3.2 Logback簡介

Logback 是一個高效、靈活的日志框架,是 SLF4J 的原生實現,通常與 SLF4J 一起使用。它提供了豐富的功能,如日志級別控制、日志輸出格式定制、日志文件輪轉等。

Spring Boot 默認使用 Logback 作為日志框架,并且配置非常簡單。我們可以通過 application.propertiesapplication.yml 文件來配置日志級別、日志文件路徑等。

3.3 配置Logback日志

日志級別配置

通過 application.properties 配置文件設置日志級別,Spring Boot 默認日志級別為 INFO。可以通過以下方式修改日志級別:

# 設置根日志級別為 DEBUG
logging.level.root=DEBUG# 設置特定包的日志級別為 TRACE
logging.level.com.example=TRACE

日志文件輸出配置

如果希望將日志輸出到文件,可以在 application.properties 中進行如下配置:

# 設置日志輸出文件
logging.file.name=app.log
logging.file.path=/var/logs

日志模式配置

Logback 提供了強大的配置功能,支持日志輸出模式(如輸出日志到控制臺、文件或遠程服務器)。以下是 Logback 的 XML 配置示例:

<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern></encoder></appender><root level="DEBUG"><appender-ref ref="CONSOLE"/></root>
</configuration>

這個配置文件指定了日志的輸出格式,采用控制臺輸出,日志格式包括時間戳和日志消息。

3.4 使用 SLF4J 記錄日志

在 Spring Boot 應用中,可以通過注入 Logger 對象來記錄日志。常見的日志級別包括 DEBUGINFOWARNERRORTRACE

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class MyService {private static final Logger logger = LoggerFactory.getLogger(MyService.class);public void someMethod() {logger.debug("This is a debug message");logger.info("This is an info message");logger.error("This is an error message");}
}

在此示例中,我們使用 LoggerFactory 獲取 Logger 對象,然后根據需要記錄不同級別的日志。


總結

錯誤處理和日志管理是開發過程中非常重要的兩個方面。在 Spring Boot 中,我們可以通過全局異常處理機制和自定義異常來簡化錯誤處理的代碼,并通過 SLF4J 和 Logback 實現高效的日志管理。通過合理的錯誤處理與日志管理,開發者可以更高效地監控應用狀態、定位問題,并在發生錯誤時提供更友好的用戶體驗。

關于作者:

15年互聯網開發、帶過10-20人的團隊,多次幫助公司從0到1完成項目開發,在TX等大廠都工作過。當下為退役狀態,寫此篇文章屬個人愛好。本人開發期間收集了很多開發課程等資料,需要可聯系我

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65928.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65928.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65928.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖解Git——分支的新建與合并《Pro Git》

?分支的新建與合并 先引入一個實際開發的工作流&#xff1a; 開發某個網站。為實現某個新的需求&#xff0c;創建一個分支。在這個分支上開展工作。 正在此時&#xff0c;你突然接到一個電話說有個很嚴重的問題需要緊急修補。你將按照如下方式來處理&#xff1a; 切換到你…

C#使用實體類Entity Framework Core操作mysql入門:從數據庫反向生成模型2 處理連接字符串

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

【數據可視化-12】數據分析崗位招聘分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

LeetCode 977 題:有序數組的平方

LeetCode 977 題&#xff1a;有序數組的平方 (Squares of a Sorted Array) LeetCode 第977題要求給定一個按非降序排列的整數數組 nums&#xff0c;返回每個數字的平方并按升序排列。 題目描述 給定一個整數數組 nums&#xff0c;它按非降序排列&#xff08;即 nums[i] < …

excel僅復制可見單元格,僅復制篩選后內容

背景 我們經常需要將內容分給不同的人&#xff0c;做完后需要合并 遇到情況如下 那是因為直接選擇了整列&#xff0c;當然不可以了。 下面提供幾種方法&#xff0c;應該都可以 直接選中要復制區域然后復制&#xff0c;不要選中最上面的列alt;選中可見單元格正常復制&#xff…

微信小程序實現拖拽盒子效果

要實現一個當前盒子高度由里面的盒子進行支配高度拖拽的效果 // wxml<view class"exmation-item" wx:elif"{{type4}}"> <view class"exmation-item-drag-box" id"drag-box"> <!-- 內容 --><view class"exm…

支持向量回歸(SVR:Support Vector Regression)用于A股數據分析、預測

簡單說明 支持向量回歸是一種用來做預測的數學方法,屬于「機器學習」的一種。 它的目標是找到一條「最合適的線」,能夠大致描述數據點的趨勢,并允許數據點離這條線有一定的誤差(不要求所有點都完全落在這條線上)。 可以把它想象成:找到一條「寬帶」或「隧道」,大部分…

透明部署、旁路邏輯串聯的區別

背景 需討論防火墻到底是串聯&#xff0c;還是旁掛。 通常串聯指的就是“透明部署”&#xff0c;旁掛指的就是“邏輯串聯”。 透明部署&#xff08;串聯&#xff09; 也稱為透明模式或橋接模式&#xff0c;是一種安全設備的部署方式。在這種模式下&#xff0c;安全設備被串聯…

LabVIEW水位監控系統

LabVIEW開發智能水位監控系統通過集成先進的傳感技術與控制算法&#xff0c;為工業液體存儲提供精確的水位調控&#xff0c;保證了生產過程的連續性與安全性。 項目背景 在化工和飲料生產等行業中&#xff0c;水位控制的準確性對保證生產安全和提高產品質量至關重要。傳統的水…

深入淺出 Android AES 加密解密:從理論到實戰

深入淺出 Android AES 加密解密&#xff1a;從理論到實戰 在現代移動應用中&#xff0c;數據安全是不可忽視的一環。無論是用戶隱私保護&#xff0c;還是敏感信息的存儲與傳輸&#xff0c;加密技術都扮演著重要角色。本文將以 AES&#xff08;Advanced Encryption Standard&am…

hadoop-yarn常用命令

一、YARN命令介紹 1. YARN命令簡介 YARN提供了一組命令行工具&#xff0c;用于管理和監控YARN應用程序和集群。 2. yarn application命令 (1) yarn application命令的基本語法 yarn application命令的基本語法如下&#xff1a; yarn application [genericOptions] [comma…

R語言的語法糖

R語言的語法糖 引言 在編程語言中&#xff0c;所謂的“語法糖”是指那些使得程序員能夠以更簡潔、直觀的方式書寫代碼的語法形式。R語言作為一種用于統計分析和數據可視化的編程語言&#xff0c;具有豐富的功能和靈活的語法。本文將深入探討R語言中的語法糖&#xff0c;幫助讀…

React Fiber框架中的Render渲染階段——workLoop(performUnitOfWork【beginWork與completeWork】)

觸發渲染過程——renderRoot renderRoot 是一個函數&#xff0c;用于觸發渲染工作。它通常會調用并遞歸地執行一系列的渲染任務&#xff0c;直到完成整個更新過程。這個過程包括執行 Fiber 樹中的 beginWork 和 completeWork&#xff0c;以及渲染新狀態或 DOM。 function ren…

【優先算法】思還故里閭,欲歸道無因 - 前綴和

本篇博客給大家帶來的是前綴和算法的知識點, 也是一樣通過OJ題理解,掌握,應用該算法. &#x1f40e;文章專欄: 算法 &#x1f680;若有問題 評論區見 ? 歡迎大家點贊 評論 收藏 分享 如果你不知道分享給誰,那就分享給薯條. 你們的支持是我不斷創作的動力 . 王子,公主請閱&…

億道三防丨三防筆記本是什么意思?和普通筆記本的優勢在哪里?

三防筆記本是什么意思&#xff1f;和普通筆記本的優勢在哪里&#xff1f; 在現代社會中&#xff0c;筆記本電腦已經成為人們工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行業或環境中&#xff0c;普通筆記本電腦由于其脆弱性和對環境條件的敏感性&#xff0c;往…

SOME/IP 協議詳解——服務發現

文章目錄 1. Introduction &#xff08;引言&#xff09;2. SOME/IP Service Discovery (SOME/IP-SD)2.1 General&#xff08;概述)2.2 SOME/IP-SD Message Format2.2.1 通用要求2.2.2 SOME/IP-SD Header2.2.3 Entry Format2.2.4 Options Format2.2.4.1 配置選項&#xff08;Co…

MATLAB語言的函數實現

MATLAB語言中的函數實現詳解 引言 MATLAB&#xff08;矩陣實驗室&#xff09;是一種高級語言和互動環境&#xff0c;廣泛應用于數值計算、數據分析、可視化以及工程與科學計算等多個領域。MATLAB的強大之處在于其豐富的函數庫以及用戶自定義函數的能力。本文將深入探討MATLAB…

Go語言之路————go環境的初始化

Go語言之路————go環境的初始化 前言一、Go的安裝二、環境配置三、初始化一個新項目四、常用的一些指令 前言 我是一名多年Java開發人員&#xff0c;因為工作需要現在要學習go語言&#xff0c;Go語言之路是一個系列&#xff0c;記錄著我從0開始接觸Go&#xff0c;到后面能正…

鼠標過濾驅動

文章目錄 概述代碼參考資料 概述 其編寫過程大體與鍵盤過濾驅動相似&#xff0c;只需要切換一下附加的目標設備以及創建的設備類型等。但在該操作后依然無法捕獲到Vmware創建的win7操作系統的鼠標irp信息&#xff0c;于是通過在獲取鼠標驅動&#xff0c;遍歷其所有的設備進而附…

鴻蒙UI開發——基于onTouch事件實現表情選擇膠囊

1、背 景 有朋友留言說&#xff0c;抖音APP中&#xff0c;長按評論按鈕觸發的快捷表情選擇膠囊動畫比較好&#xff08;效果如下圖&#xff09;&#xff0c;希望使用鴻蒙ArkTs也實現一個類似的。 本文在鴻蒙ArkTs下也實現一個類似的效果&#xff0c;如下&#xff1a; 首先&…