"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > معالجة الاستثناءات في Spring Boot

معالجة الاستثناءات في Spring Boot

تم النشر بتاريخ 2024-08-25
تصفح:806

Exception Handling in Spring Boot

تعد معالجة الاستثناءات جزءًا مهمًا من بناء تطبيقات قوية وسهلة الاستخدام. في Spring Boot، يمكننا التعامل مع الاستثناءات بطرق مختلفة لضمان بقاء تطبيقنا مستقرًا وتقديم تعليقات مفيدة للمستخدمين. سيغطي هذا الدليل استراتيجيات مختلفة لمعالجة الاستثناءات، بما في ذلك الاستثناءات المخصصة ومعالجة الاستثناءات العالمية وأخطاء التحقق من الصحة وأفضل ممارسات الإنتاج.

1. أساسيات التعامل مع الاستثناءات

الاستثناءات هي الأحداث التي تعطل التدفق الطبيعي للبرنامج. ويمكن تقسيمها إلى:

  • الاستثناءات المحددة: الاستثناءات التي يتم التحقق منها في وقت الترجمة.
  • الاستثناءات التي لم يتم التحقق منها (استثناءات وقت التشغيل): الاستثناءات التي تحدث أثناء وقت التشغيل.
  • الأخطاء: مشكلات خطيرة لا ينبغي للتطبيقات التعامل معها، مثل OutOfMemoryError.

2. فئات الاستثناءات المخصصة

يساعد إنشاء فئات استثناءات مخصصة في معالجة حالات خطأ محددة في تطبيقك.

package com.example.SpringBootRefresher.exception;

public class DepartmentNotFoundException extends RuntimeException {
    public DepartmentNotFoundException(String message) {
        super(message);
    }
}

3. معالجة الاستثناءات في وحدات التحكم

@ExceptionHandler التعليق التوضيحي:
يمكنك تحديد طرق للتعامل مع الاستثناءات في فئات وحدة التحكم الخاصة بك.

package com.example.SpringBootRefresher.controller;

import com.example.SpringBootRefresher.exception.DepartmentNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DepartmentController {

    @GetMapping("/department")
    public String getDepartment() {
        // Simulate an exception
        throw new DepartmentNotFoundException("Department not found!");
    }

    @ExceptionHandler(DepartmentNotFoundException.class)
    public ResponseEntity handleDepartmentNotFoundException(DepartmentNotFoundException ex) {
        return new ResponseEntity(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

4. التعامل مع الاستثناءات العالمية باستخدام @ControllerAdvice

للتعامل مع الاستثناءات عالميًا، يمكنك استخدام @ControllerAdvice ومعالج استثناء مركزي.

package com.example.SpringBootRefresher.error;

import com.example.SpringBootRefresher.entity.ErrorMessage;
import com.example.SpringBootRefresher.exception.DepartmentNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
@ResponseStatus
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(DepartmentNotFoundException.class)
    public ResponseEntity handleDepartmentNotFoundException(DepartmentNotFoundException exception, WebRequest request) {
        ErrorMessage message = new ErrorMessage(
                HttpStatus.NOT_FOUND.value(),
                exception.getMessage(),
                request.getDescription(false)
        );

        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                .body(message);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity handleGlobalException(Exception exception, WebRequest request) {
        ErrorMessage message = new ErrorMessage(
                HttpStatus.INTERNAL_SERVER_ERROR.value(),
                exception.getMessage(),
                request.getDescription(false)
        );

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(message);
    }
}

5. إنشاء استجابة للخطأ القياسي

حدد فئة الاستجابة للأخطاء القياسية لتنظيم رسائل الخطأ الخاصة بك.

package com.example.SpringBootRefresher.entity;

public class ErrorMessage {
    private int statusCode;
    private String message;
    private String description;

    public ErrorMessage(int statusCode, String message, String description) {
        this.statusCode = statusCode;
        this.message = message;
        this.description = description;
    }

    // Getters and setters

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

6. التعامل مع أخطاء التحقق من الصحة

يتكامل Spring Boot بشكل جيد مع التحقق من صحة الفول (JSR-380). للتعامل مع أخطاء التحقق من الصحة على مستوى العالم، استخدم @ControllerAdvice.

package com.example.SpringBootRefresher.error;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
@ResponseStatus
public class ValidationExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map errors = new HashMap();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return new ResponseEntity(errors, HttpStatus.BAD_REQUEST);
    }
}

7. استخدامResponseStatus للاستثناءات البسيطة

في الحالات البسيطة، يمكنك إضافة تعليق توضيحي لفئة الاستثناء باستخدام @ResponseStatus لتحديد رمز حالة HTTP.

package com.example.SpringBootRefresher.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

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

8. أفضل الممارسات للإنتاج

  1. استجابات الأخطاء المتسقة: تأكد من أن تطبيقك يُرجع استجابات أخطاء متسقة ومنظمة. استخدم فئة الاستجابة للأخطاء القياسية.
  2. التسجيل: تسجيل الاستثناءات لأغراض التصحيح والمراقبة. تأكد من عدم كشف المعلومات الحساسة في السجلات.
  3. رسائل سهلة الاستخدام: توفير رسائل خطأ سهلة الاستخدام. تجنب الكشف عن التفاصيل الداخلية أو تتبعات المكدس للمستخدمين.
  4. الأمان: كن حذرًا بشأن المعلومات المضمنة في ردود الأخطاء لتجنب كشف البيانات الحساسة.
  5. التوثيق: قم بتوثيق استراتيجية معالجة الاستثناءات لفريقك والمشرفين المستقبليين.

ملخص

تتضمن معالجة الاستثناءات في Spring Boot استخدام التعليقات التوضيحية مثل @ExceptionHandler و@ControllerAdvice و@ResponseStatus لإدارة الأخطاء بشكل فعال. من خلال إنشاء استثناءات مخصصة، ومعالجة أخطاء التحقق من الصحة، واتباع أفضل الممارسات، يمكنك إنشاء تطبيقات قوية تتعامل مع الأخطاء بأمان وتقدم تعليقات مفيدة للمستخدمين. يضمن استخدام ميزات Java 17 أن يستفيد تطبيقك من أحدث التحسينات في نظام Java البيئي.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/isaactony/exception-handling-in-spring-boot-2lgd?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3