博客 / 詳情

返回

代碼中的異常處理

在開發過程中,異常處理是保證系統穩定性和提升用户體驗的重要環節。根據不同的情況,我們通常將異常分為 業務異常系統異常,並根據不同類型的異常採取不同的處理策略。

1. 業務異常(Business Exception)

定義:

業務異常通常由應用程序的業務邏輯或用户輸入錯誤引發。它們表示業務操作不符合預期或違反了業務規則,通常不影響系統的穩定性。

何時拋出業務異常?

  • 用户輸入無效,如表單數據格式錯誤、必填字段缺失等。
  • 業務邏輯錯誤,例如賬户餘額不足、訂單狀態不允許操作等。
  • 業務規則不匹配,例如用户嘗試進行不符合業務規則的操作。

如何拋出業務異常?

在代碼中通常會定義自定義的業務異常類(如 BusinessException),包含錯誤碼和錯誤信息。

public class BusinessException extends RuntimeException {
    private String errorCode;
    private String errorMessage;

    public BusinessException(String errorCode, String errorMessage) {
        super(errorMessage);
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    // Getter and Setter methods
}

如何處理業務異常?

  • 捕獲與處理:業務異常通常在業務層(service 層)拋出,並在上層通過統一異常處理機制捕獲,返回給用户友好的錯誤信息。
  • 不影響系統運行:業務異常一般不會導致系統崩潰,更多的是指示業務操作的失敗。
public void updateAccountBalance(Long accountId, BigDecimal amount) {
    if (amount.compareTo(BigDecimal.ZERO) < 0) {
        throw new BusinessException("ERR_NEGATIVE_AMOUNT", "Amount cannot be negative");
    }
    // 業務邏輯處理
}

2. 系統異常(System Exception)

定義:

系統異常通常是由系統資源問題、環境錯誤或其他不可預見的錯誤引發的。這些異常一般表示系統發生了錯誤,可能會影響到系統的穩定性和可用性。

何時拋出系統異常?

  • 資源不可用:如數據庫連接失敗、文件系統異常、網絡不可達等。
  • 系統級錯誤:如線程池耗盡、內存溢出、磁盤空間不足等。
  • 不可恢復的錯誤:如外部服務不可用、核心服務出現故障等。

如何拋出系統異常?

系統異常通常使用標準異常類(如 IOExceptionSQLException)或者自定義的系統異常類。

public class SystemException extends RuntimeException {
    private String errorCode;
    private String errorMessage;

    public SystemException(String errorCode, String errorMessage) {
        super(errorMessage);
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    // Getter and Setter methods
}

如何處理系統異常?

  • 日誌記錄和報警:系統異常需要記錄詳細的日誌,並在關鍵錯誤發生時發送報警。
  • 中斷當前操作:通常中止當前操作,並返回給用户系統錯誤信息。
  • 系統恢復機制:通過事務回滾、重試機制等儘量避免系統崩潰。
public void processPayment(Payment payment) {
    try {
        // 嘗試連接支付網關
        connectToPaymentGateway(payment);
    } catch (IOException e) {
        throw new SystemException("ERR_IO_EXCEPTION", "Failed to connect to payment gateway");
    }
}

3. 業務異常與系統異常的區別

特性 業務異常 系統異常
發生原因 業務邏輯問題、用户操作錯誤 系統資源問題、環境錯誤、無法預料的程序異常
是否可恢復 通常是可恢復的,業務可以重新嘗試 一般是不可恢復的,可能導致系統或服務中斷
是否影響系統 不影響系統運行,可以繼續處理其他請求 可能影響系統的穩定性或可用性,嚴重時會導致系統崩潰
拋出位置 業務層(Service 層) 系統底層(DAO 層、框架層、資源連接層等)
處理方式 捕獲後返回業務錯誤信息,進行業務流程回退 記錄日誌,報警,可能中斷當前操作,返回系統錯誤信息

4. 異常處理架構設計

為了統一管理業務異常和系統異常,我們需要設計一個異常處理框架,包括全局異常處理器和日誌/報警系統。

全局異常處理器

使用 @ControllerAdvice 或全局異常處理類來捕獲業務異常和系統異常,並返回統一格式的錯誤信息給用户。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {
        ErrorResponse response = new ErrorResponse(ex.getErrorCode(), ex.getErrorMessage());
        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(SystemException.class)
    public ResponseEntity<ErrorResponse> handleSystemException(SystemException ex) {
        // 記錄日誌,可能發送報警
        ErrorResponse response = new ErrorResponse(ex.getErrorCode(), ex.getErrorMessage());
        return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

日誌和報警系統

系統異常需要記錄詳細日誌,並根據嚴重性發送報警通知,幫助及時發現和響應系統錯誤。


總結

  • 業務異常:由業務邏輯錯誤或用户輸入錯誤引發,不影響系統運行,適合通過友好的錯誤信息返回給用户。
  • 系統異常:由系統資源問題或不可預見的錯誤引發,可能影響系統的穩定性,需通過日誌記錄、報警和中斷操作來處理。

合理的異常分類與處理可以幫助我們在確保系統穩定的同時,提供良好的用户體驗和開發可維護性。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.