Spring Boot এবং Exception Handling

Java Technologies - স্প্রিং বুট (Spring Boot)
133
133

স্প্রিং বুটে Exception Handling কি?

Exception handling (অপবাদ হ্যান্ডলিং) হল এমন একটি প্রক্রিয়া যেখানে সিস্টেমের চলার সময় যে কোনো ভুল বা অস্বাভাবিক পরিস্থিতি মোকাবিলা করা হয়। স্প্রিং বুটে এক্সসেপশন হ্যান্ডলিং একটি গুরুত্বপূর্ণ বিষয়, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ইউজার এক্সপেরিয়েন্স উন্নত করতে সহায়তা করে।

স্প্রিং বুটে exception handling কিভাবে কাজ করবে তা বিভিন্ন কৌশলে করা যায়, যেমন:

  • Controller Level Exception Handling
  • Global Exception Handling
  • Custom Exception Handling

স্প্রিং বুট নিজেই কিছু সাধারণ এক্সসেপশন (যেমন 404 Not Found, 400 Bad Request ইত্যাদি) হ্যান্ডল করে থাকে, তবে কাস্টম এক্সসেপশন এবং এর রেসপন্স ম্যানেজ করার জন্য বিশেষ কৌশল ব্যবহৃত হয়।


স্প্রিং বুটে Exception Handling এর কৌশল

১. Controller Level Exception Handling

স্প্রিং বুটে প্রতিটি কন্ট্রোলারের মধ্যে এক্সসেপশন হ্যান্ডলিং করা যায়। এই ক্ষেত্রে, আমরা @ExceptionHandler অ্যানোটেশন ব্যবহার করে নির্দিষ্ট এক্সসেপশনগুলির জন্য মেথড লিখতে পারি।

উদাহরণস্বরূপ, যদি একটি EmployeeNotFoundException ঘটে, তাহলে কন্ট্রোলারের মধ্যে সেই এক্সসেপশনটি হ্যান্ডল করা যাবে:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;

@RestController
public class EmployeeController {

    @GetMapping("/employee/{id}")
    public Employee getEmployee(@PathVariable Long id) {
        Employee employee = employeeService.getEmployeeById(id);
        if (employee == null) {
            throw new EmployeeNotFoundException("Employee not found with id " + id);
        }
        return employee;
    }

    @ExceptionHandler(EmployeeNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleEmployeeNotFound(EmployeeNotFoundException exception) {
        return exception.getMessage();
    }
}

এখানে:

  • @ExceptionHandler ব্যবহার করে EmployeeNotFoundException এক্সসেপশন হ্যান্ডল করা হয়েছে।
  • @ResponseStatus(HttpStatus.NOT_FOUND) দ্বারা HTTP স্টেটাস কোড 404 ফেরত পাঠানো হচ্ছে।

২. Global Exception Handling

স্প্রিং বুটের একটি বিশেষ সুবিধা হলো Global Exception Handling, যা একটি সেন্ট্রালাইজড অবস্থানে সমস্ত এক্সসেপশন হ্যান্ডল করতে সহায়তা করে। এর জন্য @ControllerAdvice এবং @ExceptionHandler ব্যবহার করা হয়। এতে করে সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিং করা সম্ভব হয়।

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(EmployeeNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleEmployeeNotFound(EmployeeNotFoundException exception, Model model) {
        model.addAttribute("error", exception.getMessage());
        return "error";
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleGenericException(Exception exception, Model model) {
        model.addAttribute("error", "An unexpected error occurred.");
        return "error";
    }
}

এখানে:

  • @ControllerAdvice অ্যানোটেশন ব্যবহার করা হয়েছে, যা সারা অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডলিংয়ের জন্য একটি সাধারণ স্থানে ব্যবহৃত হয়।
  • @ExceptionHandler ব্যবহার করে নির্দিষ্ট এক্সসেপশন বা সাধারণ এক্সসেপশন হ্যান্ডল করা হয়েছে।

৩. Custom Exception তৈরি করা

স্প্রিং বুটের মধ্যে আপনি নিজের কাস্টম এক্সসেপশনও তৈরি করতে পারেন। একটি কাস্টম এক্সসেপশন তৈরি করতে আপনাকে সাধারণত RuntimeException অথবা Exception ক্লাস এক্সটেন্ড করতে হবে।

public class EmployeeNotFoundException extends RuntimeException {

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

এখানে, EmployeeNotFoundException কাস্টম এক্সসেপশন ক্লাস তৈরি করা হয়েছে যা RuntimeException এক্সটেন্ড করে।

৪. Error Response Format

এক্সসেপশন হ্যান্ডলিং করার সময় অনেক সময় আপনি কাস্টম এরর রেসপন্স ফর্ম্যাট তৈরি করতে চাইবেন। এটি বিশেষ করে RESTful API-তে সহায়ক হয়। নিচে একটি কাস্টম এরর রেসপন্স ক্লাসের উদাহরণ দেয়া হলো:

public class ErrorResponse {

    private String message;
    private String details;

    public ErrorResponse(String message, String details) {
        this.message = message;
        this.details = details;
    }

    // Getters and setters
}

এখন GlobalExceptionHandler ক্লাসে এই ErrorResponse ক্লাসটি ব্যবহার করা যায়:

@ExceptionHandler(EmployeeNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleEmployeeNotFound(EmployeeNotFoundException exception) {
    return new ErrorResponse(exception.getMessage(), "Details about the error");
}

এটি API রেসপন্সে কাস্টম এরর মেসেজ এবং বিস্তারিত তথ্য প্রদান করবে।


সারাংশ

স্প্রিং বুটে Exception Handling অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের ত্রুটিগুলো সঠিকভাবে হ্যান্ডল করতে সাহায্য করে। আপনি কন্ট্রোলার লেভেল, গ্লোবাল লেভেল, অথবা কাস্টম এক্সসেপশন তৈরি করে একটি সিস্টেমের জন্য সঠিক এক্সসেপশন হ্যান্ডলিং কৌশল নির্বাচন করতে পারেন। এর মাধ্যমে অ্যাপ্লিকেশনটি ত্রুটিপূর্ণ পরিস্থিতি সঠিকভাবে ম্যানেজ করে এবং ইউজারকে পরিষ্কার এবং সঠিক তথ্য প্রদান করে।

Content added By

Spring Boot তে Exception Handling এর প্রয়োজনীয়তা

76
76

Spring Boot অ্যাপ্লিকেশনে Exception Handling খুবই গুরুত্বপূর্ণ, কারণ এটি ব্যবহারকারী বা ক্লায়েন্টকে অ্যাপ্লিকেশনের যে কোনো ত্রুটি বা অপ্রত্যাশিত পরিস্থিতি সম্পর্কে সঠিক এবং সুসংগঠিত বার্তা প্রদান করতে সহায়তা করে। একটি শক্তিশালী Exception Handling সিস্টেম অ্যাপ্লিকেশনটিকে আরও নির্ভরযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।

চলুন দেখে নেওয়া যাক কেন Spring Boot অ্যাপ্লিকেশনগুলিতে Exception Handling এর প্রয়োজনীয়তা রয়েছে এবং এটি কীভাবে কার্যকরী হতে পারে।


Exception Handling এর প্রয়োজনীয়তা

১. অ্যাপ্লিকেশন স্টেবলিটি এবং রিলায়াবিলিটি

Exception Handling অ্যাপ্লিকেশনকে স্থিতিশীল (stable) এবং নির্ভরযোগ্য (reliable) রাখে। কোনো অপ্রত্যাশিত ত্রুটি বা ব্যতিক্রম (exception) ঘটলে, সেটি যথাযথভাবে হ্যান্ডেল করা প্রয়োজন। যদি এই ত্রুটিগুলো হ্যান্ডেল না করা হয়, তাহলে অ্যাপ্লিকেশন ক্র্যাশ বা বন্ধ হয়ে যেতে পারে। এর ফলে, ব্যবহারকারীরা অ্যাপ্লিকেশন ব্যবহার করতে পারবেন না।

Spring Boot তে সেন্ট্রালাইজড Exception Handling ব্যবহারের মাধ্যমে, আপনি সমস্ত ব্যতিক্রমের জন্য একটি সাধারণ সিস্টেম তৈরি করতে পারেন, যা অ্যাপ্লিকেশনকে স্থিতিশীল রাখে।

২. ব্যবহারকারীকে স্পষ্ট ত্রুটি বার্তা প্রদান

Exception Handling এর মাধ্যমে, আপনি ক্লায়েন্ট বা ব্যবহারকারীকে সঠিক এবং পরিষ্কার ত্রুটি বার্তা প্রদান করতে পারেন। যেমন, HTTP স্ট্যাটাস কোড এবং কাস্টম ত্রুটি বার্তা রিটার্ন করে, যা ব্যবহারকারীর কাছে আরও কার্যকরী এবং সহজবোধ্য হয়।

যেমন:

  • 404 Not Found: যদি একটি রিসোর্স পাওয়া না যায়।
  • 400 Bad Request: যদি ক্লায়েন্টের পক্ষ থেকে ভুল রিকোয়েস্ট করা হয়।
  • 500 Internal Server Error: যদি সার্ভারে অপ্রত্যাশিত ত্রুটি ঘটে।

৩. ডিবাগিং এবং লগিং এর সুবিধা

Exception Handling এর মাধ্যমে আপনি ব্যতিক্রমগুলোর ডিটেইলড লগ তৈরি করতে পারেন। এটি ডেভেলপারদের ত্রুটি ট্র্যাক করতে সাহায্য করে এবং অ্যাপ্লিকেশন ডিবাগিংকে সহজ করে তোলে। যে কোনো ত্রুটি ঘটলে, লগে এর বিস্তারিত তথ্য থাকা প্রয়োজন, যাতে ডেভেলপাররা সমস্যা সমাধানে দ্রুত পদক্ষেপ নিতে পারে।

৪. কাস্টম ত্রুটি কোড এবং রেসপন্স মেসেজ

Spring Boot এ আপনি কাস্টম Exception তৈরি করতে পারেন এবং সেই অনুযায়ী রেসপন্স কোড এবং বার্তা কাস্টমাইজ করতে পারেন। এতে, আপনি আপনার API তে আরও ব্যবহারকারী-বান্ধব ত্রুটি বার্তা প্রদান করতে পারবেন।

যেমন:

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource not found")
public class ResourceNotFoundException extends RuntimeException {
    // Exception handling code
}

এটি 404 রেসপন্স কোডের সাথে "Resource not found" বার্তা প্রদান করবে।

৫. নিরাপত্তা বৃদ্ধি

ত্রুটিগুলি সঠিকভাবে হ্যান্ডেল না করলে, আক্রমণকারীরা সেগুলোকে অপব্যবহার করতে পারে। উদাহরণস্বরূপ, যদি আপনি অ্যাপ্লিকেশনের অপ্রকাশিত ত্রুটিগুলো প্রকাশ করেন, তবে হ্যাকাররা সেই ত্রুটিগুলির মাধ্যমে নিরাপত্তা ভাঙতে পারে। Spring Boot এর Exception Handling এর মাধ্যমে আপনি ত্রুটির বিস্তারিত তথ্য বাইরে প্রকাশ না করে নিরাপত্তা বৃদ্ধি করতে পারেন।


Spring Boot এ Exception Handling এর কৌশল

Spring Boot এ Exception Handling করার জন্য বিভিন্ন কৌশল রয়েছে। কিছু সাধারণ কৌশল হলো:

১. @ExceptionHandler ব্যবহার

Spring MVC তে @ExceptionHandler ব্যবহার করে আপনি নির্দিষ্ট ধরনের ব্যতিক্রম হ্যান্ডল করতে পারেন।

@RestController
public class UserController {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        User user = userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found"));
        return user;
    }
}

এখানে, @ExceptionHandler ব্যবহার করে ResourceNotFoundException হ্যান্ডল করা হয়েছে। যখন এই ধরনের ব্যতিক্রম ঘটবে, তখন একটি কাস্টম মেসেজ এবং HTTP স্ট্যাটাস কোড রিটার্ন করা হবে।

২. @ControllerAdvice ব্যবহার

@ControllerAdvice একটি গ্লোবাল Exception Handling ক্লাস তৈরি করার জন্য ব্যবহৃত হয়, যা সমস্ত কন্ট্রোলারের জন্য সাধারণ Exception Handling হ্যান্ডলিং প্রদান করে।

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGenericException(Exception ex) {
        return new ResponseEntity<>("Internal Server Error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

এটি সমস্ত কন্ট্রোলারে ResourceNotFoundException এবং অন্যান্য ব্যতিক্রমের জন্য গ্লোবাল Exception Handling সেট আপ করে।

৩. @ResponseStatus অ্যানোটেশন

@ResponseStatus অ্যানোটেশনটি একটি কাস্টম Exception তৈরি করার জন্য ব্যবহৃত হয়, যা স্বয়ংক্রিয়ভাবে নির্দিষ্ট HTTP স্ট্যাটাস কোড রিটার্ন করবে।

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

এই Exception টিকে Spring Boot স্বয়ংক্রিয়ভাবে HTTP 404 স্ট্যাটাস কোড সহ রিটার্ন করবে।

৪. ResponseEntity ব্যবহার

ResponseEntity হল একটি গুরুত্বপূর্ণ ক্লাস যা আপনাকে HTTP রেসপন্স কাস্টমাইজ করতে সহায়তা করে। আপনি এটি ব্যবহার করে কাস্টম রেসপন্স হেডার, স্ট্যাটাস কোড এবং বডি কন্টেন্ট রিটার্ন করতে পারেন।

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
    return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND);
}

সারাংশ

Spring Boot অ্যাপ্লিকেশনে Exception Handling অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনকে স্থিতিশীল এবং নির্ভরযোগ্য রাখে, ব্যবহারকারীদের জন্য স্পষ্ট ত্রুটি বার্তা প্রদান করে, এবং নিরাপত্তা ও ডিবাগিং সুবিধা উন্নত করে। Spring Boot এ Exception Handling বিভিন্ন কৌশল যেমন @ExceptionHandler, @ControllerAdvice, @ResponseStatus, এবং ResponseEntity ব্যবহার করে করা যায়। সঠিক Exception Handling অ্যাপ্লিকেশনের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করে, যা একে আরও শক্তিশালী এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।


Content added By

@ControllerAdvice এবং @ExceptionHandler এর ব্যবহার

56
56

Spring Boot অ্যাপ্লিকেশন তৈরি করার সময়, ভুল (exception) হ্যান্ডলিং একটি গুরুত্বপূর্ণ অংশ। যখনই কোনো ত্রুটি বা ব্যতিক্রম ঘটে, তখন সেই ত্রুটির সঠিকভাবে হ্যান্ডলিং করা দরকার, যাতে অ্যাপ্লিকেশন নির্বিঘ্নে চলতে পারে এবং ব্যবহারকারীকে উপযুক্ত তথ্য প্রদান করা যায়। Spring Framework এই সমস্যা সমাধানের জন্য দুটি গুরুত্বপূর্ণ অ্যানোটেশন প্রদান করেছে: @ControllerAdvice এবং @ExceptionHandler

এই টিউটোরিয়ালে, আমরা @ControllerAdvice এবং @ExceptionHandler এর ব্যবহার বিস্তারিতভাবে আলোচনা করব।


@ControllerAdvice

@ControllerAdvice হল একটি স্প্রিং অ্যানোটেশন যা গ্লোবাল (বিশ্বব্যাপী) এক্সসেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি সমস্ত কন্ট্রোলার ক্লাসে সংঘটিত ব্যতিক্রমগুলোকে একটি একক পয়েন্ট থেকে হ্যান্ডল করতে সাহায্য করে। একে একটি সেন্ট্রাল প্লেস হিসেবে ব্যবহার করা হয়, যেখানে আপনি সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিংয়ের কাস্টমাইজড পদ্ধতি নির্ধারণ করতে পারেন।

প্রধান বৈশিষ্ট্যসমূহ:

  1. গ্লোবাল এক্সসেপশন হ্যান্ডলিং: এটি সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিংয়ের একটি সাধারণ পদ্ধতি প্রদান করে।
  2. এমনকি কাস্টম এক্সসেপশনও হ্যান্ডল করতে পারে: আপনি কাস্টম এক্সসেপশনগুলোও হ্যান্ডল করতে পারবেন।
  3. ResponseEntity-এর মাধ্যমে কাস্টম রেসপন্স প্রদান: আপনি কাস্টম HTTP রেসপন্স কোড সহ ত্রুটি মেসেজ পাঠাতে পারেন।

উদাহরণ

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGlobalException(Exception ex) {
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

এখানে, আমরা ResourceNotFoundException এবং সাধারণ Exception হ্যান্ডলিংয়ের জন্য দুটি আলাদা মেথড ব্যবহার করেছি। @ExceptionHandler অ্যাপ্লিকেশনটিতে যেকোনো কন্ট্রোলারের জন্য এই এক্সসেপশনগুলোকে গ্লোবালি হ্যান্ডল করতে পারে।


@ExceptionHandler

@ExceptionHandler অ্যানোটেশনটি ব্যবহৃত হয় এক বা একাধিক নির্দিষ্ট ব্যতিক্রম (exception) হ্যান্ডল করার জন্য। এটি কেবলমাত্র নির্দিষ্ট কন্ট্রোলার ক্লাসের মধ্যে কার্যকরী, কিন্তু যখন এটি @ControllerAdvice এর সাথে ব্যবহার করা হয়, তখন এটি গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।

প্রধান বৈশিষ্ট্যসমূহ:

  1. নির্দিষ্ট এক্সসেপশন হ্যান্ডলিং: @ExceptionHandler শুধুমাত্র সেই এক্সসেপশন হ্যান্ডল করে, যা মেথডে উল্লেখ করা হয়।
  2. বিশেষ কাস্টম এক্সসেপশন হ্যান্ডলিং: আপনি কাস্টম এক্সসেপশন হ্যান্ডল করতে পারেন যা অ্যাপ্লিকেশনে নির্দিষ্ট কোনো সমস্যার জন্য তৈরি করা হয়।

উদাহরণ

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        if (user == null) {
            throw new ResourceNotFoundException("User not found with id: " + id);
        }
        return user;
    }
    
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

এখানে, যদি getUser মেথডে ResourceNotFoundException ফেলা হয়, তাহলে @ExceptionHandler সেই এক্সসেপশনটি হ্যান্ডল করবে এবং একটি কাস্টম HTTP রেসপন্স ফিরিয়ে দেবে।


@ControllerAdvice এবং @ExceptionHandler এর মিল এবং পার্থক্য

  • মিল: উভয়ই ব্যতিক্রম (exception) হ্যান্ডল করার জন্য ব্যবহৃত হয়। @ExceptionHandler একটি নির্দিষ্ট এক্সসেপশন ক্লাসের জন্য এবং @ControllerAdvice সমস্ত কন্ট্রোলারে এক্সসেপশন হ্যান্ডল করার জন্য ব্যবহৃত হয়।
  • পার্থক্য: @ControllerAdvice হল একটি গ্লোবাল সেন্ট্রাল পয়েন্ট যা একাধিক কন্ট্রোলারের এক্সসেপশন হ্যান্ডল করতে পারে, যেখানে @ExceptionHandler নির্দিষ্ট কন্ট্রোলারের মধ্যে ব্যবহৃত হয় এবং শুধুমাত্র নির্দিষ্ট এক্সসেপশন হ্যান্ডল করে।

সারাংশ

Spring Boot অ্যাপ্লিকেশনে @ControllerAdvice এবং @ExceptionHandler ব্যতিক্রম (exception) হ্যান্ডলিংয়ের জন্য অত্যন্ত শক্তিশালী সরঞ্জাম। @ControllerAdvice গ্লোবালভাবে ব্যতিক্রম হ্যান্ডল করার জন্য ব্যবহৃত হয় এবং @ExceptionHandler এক বা একাধিক নির্দিষ্ট ব্যতিক্রমের জন্য ব্যবহৃত হয়। এই দুটি অ্যানোটেশন ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে সব ধরনের ত্রুটি এবং ব্যতিক্রম কার্যকরীভাবে হ্যান্ডল করতে পারবেন এবং ব্যবহারকারীদের জন্য কাস্টম ত্রুটি বার্তা বা HTTP রেসপন্স পাঠাতে পারবেন।

Content added By

Custom Exception তৈরি এবং Handle করা

63
63

স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশনে কাস্টম এক্সসেপশন তৈরি এবং হ্যান্ডল করা অত্যন্ত গুরুত্বপূর্ণ, কারণ এর মাধ্যমে আপনি অ্যাপ্লিকেশনটির ত্রুটিগুলিকে আরও স্পষ্টভাবে এবং কার্যকরভাবে পরিচালনা করতে পারবেন। কাস্টম এক্সসেপশন ব্যবহার করার মাধ্যমে আপনার কোড আরও পরিষ্কার ও রক্ষণাবেক্ষণযোগ্য হয়।


কাস্টম এক্সসেপশন তৈরি করা

স্প্রিং বুটে কাস্টম এক্সসেপশন তৈরি করার জন্য, আপনাকে একটি নতুন ক্লাস তৈরি করতে হবে যা সাধারণত RuntimeException বা Exception থেকে এক্সটেন্ড করে। এভাবে আপনি নিজের এক্সসেপশন তৈরি করতে পারবেন এবং এটি প্রয়োজনে কাস্টম মেসেজসহ পরিচালনা করতে পারবেন।

কাস্টম এক্সসেপশন ক্লাস তৈরি করা:

public class ResourceNotFoundException extends RuntimeException {
    private String resourceName;
    private String fieldName;
    private Object fieldValue;

    public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
        super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    public String getResourceName() {
        return resourceName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public Object getFieldValue() {
        return fieldValue;
    }
}

এই উদাহরণে, আমরা একটি ResourceNotFoundException কাস্টম এক্সসেপশন তৈরি করেছি, যা একটি নির্দিষ্ট রিসোর্স যেমন "User" বা "Product" এর জন্য একটি ফিল্ড এবং তার মান গ্রহণ করে। যখন কোনো রিসোর্স খুঁজে পাওয়া না যায়, তখন এই এক্সসেপশনটি থ্রো হবে।


কাস্টম এক্সসেপশন হ্যান্ডলিং

স্প্রিং বুটে কাস্টম এক্সসেপশন হ্যান্ডল করতে @ControllerAdvice অ্যানোটেশন ব্যবহার করা হয়। এটি গ্লোবালি অ্যাপ্লিকেশনের যেকোনো এক্সসেপশন হ্যান্ডল করতে সাহায্য করে। @ExceptionHandler অ্যানোটেশন দিয়ে আপনি বিশেষভাবে কাস্টম এক্সসেপশন ক্যাচ করতে পারেন।

কাস্টম এক্সসেপশন হ্যান্ডলার তৈরি করা:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ErrorDetails> handleResourceNotFoundException(ResourceNotFoundException ex) {
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), ex.getResourceName(), ex.getFieldName(), ex.getFieldValue());
        return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorDetails> handleGlobalException(Exception ex) {
        ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), "Unknown", "Unknown", "Unknown");
        return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

এখানে, @ExceptionHandler অ্যানোটেশনটি ResourceNotFoundException এবং অন্যান্য সাধারণ এক্সসেপশন হ্যান্ডল করার জন্য ব্যবহার করা হয়েছে। যখন কোনো ResourceNotFoundException থ্রো হবে, তখন এটি কাস্টম মেসেজসহ ErrorDetails অবজেক্ট তৈরি করে ক্লায়েন্টকে পাঠানো হবে।

ErrorDetails ক্লাস তৈরি করা:

public class ErrorDetails {
    private Date timestamp;
    private String message;
    private String resourceName;
    private String fieldName;
    private Object fieldValue;

    public ErrorDetails(Date timestamp, String message, String resourceName, String fieldName, Object fieldValue) {
        this.timestamp = timestamp;
        this.message = message;
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    // Getters and Setters
}

এই ErrorDetails ক্লাসে ত্রুটির সময়, মেসেজ, রিসোর্সের নাম, ফিল্ডের নাম এবং ফিল্ডের মান সংরক্ষিত থাকবে, যা ক্লায়েন্টকে পাঠানো হবে।


কাস্টম এক্সসেপশন থ্রো করা

কাস্টম এক্সসেপশন থ্রো করার জন্য আপনাকে throw কীওয়ার্ড ব্যবহার করতে হবে। উদাহরণস্বরূপ, আপনি যদি একটি রিসোর্স না পেয়ে যান, তবে ResourceNotFoundException থ্রো করতে পারেন।

কাস্টম এক্সসেপশন থ্রো করার উদাহরণ:

public User getUserById(Long userId) {
    User user = userRepository.findById(userId).orElse(null);
    if (user == null) {
        throw new ResourceNotFoundException("User", "id", userId);
    }
    return user;
}

এখানে, getUserById মেথডে যদি ইউজার না পাওয়া যায়, তবে ResourceNotFoundException কাস্টম এক্সসেপশন থ্রো করা হবে, এবং এটি গ্লোবাল এক্সসেপশন হ্যান্ডলার দ্বারা হ্যান্ডল হবে।


কাস্টম এক্সসেপশন কাস্টমাইজেশন

স্প্রিং বুটের কাস্টম এক্সসেপশন আরো কাস্টমাইজ করা যেতে পারে যেমন:

  • বিভিন্ন HTTP স্টেটাস কোড ব্যবহার করা
  • এক্সসেপশন মেসেজের মধ্যে আরও বিস্তারিত তথ্য প্রদান করা
  • এক্সসেপশনগুলোকে নির্দিষ্ট আর্কিটেকচার বা প্রোটোকল অনুযায়ী আউটপুট করা

উপসংহার

স্প্রিং বুটে কাস্টম এক্সসেপশন তৈরি এবং হ্যান্ডল করা খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনের ত্রুটিগুলিকে স্পষ্টভাবে এবং কার্যকরভাবে পরিচালনা করতে সাহায্য করে। কাস্টম এক্সসেপশন এবং গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের মাধ্যমে আপনি কোডের গঠন উন্নত করতে পারেন এবং ডিবাগিং প্রক্রিয়াকে আরও সহজ করতে পারেন।

Content added By

উদাহরণ সহ Exception Handling

91
91

স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশনগুলিতে এক্সসেপশন হ্যান্ডলিং একটি অত্যন্ত গুরুত্বপূর্ণ দিক, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে। এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে আমরা একটি পরিষ্কার এবং অর্থপূর্ণ ত্রুটি বার্তা প্রদান করতে পারি, যা ডেভেলপারদের জন্য ডিবাগিং এবং ব্যবহারকারীদের জন্য সমস্যা সমাধান সহজ করে তোলে।

স্প্রিং বুটে এক্সসেপশন হ্যান্ডলিং করার জন্য কিছু গুরুত্বপূর্ণ কৌশল রয়েছে, যেমন @ControllerAdvice, @ExceptionHandler, এবং কাস্টম এক্সসেপশন তৈরি করা। এখানে আমরা একটি উদাহরণের মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশন থেকে এক্সসেপশন হ্যান্ডলিং কিভাবে করা যায় তা দেখব।


১. সাধারণ এক্সসেপশন হ্যান্ডলিং

স্প্রিং বুট অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডলিং করার জন্য আমরা সাধারণত @ExceptionHandler এবং @ControllerAdvice ব্যবহার করি। এখানে আমরা একটি উদাহরণ দেখব যেখানে একটি সাধারণ UserNotFoundException এক্সসেপশন তৈরি করা হবে এবং এটি কিভাবে হ্যান্ডেল করা যায় তা দেখানো হবে।

Step 1: কাস্টম এক্সসেপশন তৈরি করা

প্রথমে আমাদের একটি কাস্টম এক্সসেপশন তৈরি করতে হবে। এটি এমন একটি এক্সসেপশন হবে যা ব্যবহারকারী না পাওয়া গেলে থ্রো করা হবে।

package com.example.demo.exception;

public class UserNotFoundException extends RuntimeException {

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

এখানে UserNotFoundException একটি রানটাইম এক্সসেপশন, যা ব্যবহারকারী না পাওয়া গেলে ছোড়া হবে।


Step 2: কন্ট্রোলারে এক্সসেপশন থ্রো করা

এখন, কন্ট্রোলারে আমরা UserNotFoundException থ্রো করব যদি কোনো ব্যবহারকারী নির্দিষ্ট আইডি দিয়ে পাওয়া না যায়।

package com.example.demo.controller;

import com.example.demo.exception.UserNotFoundException;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    // GET: Retrieve a user by ID
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));
    }
}

এখানে, যদি userRepository.findById(id) কোনো ব্যবহারকারী না পায়, তবে UserNotFoundException থ্রো হবে।


Step 3: এক্সসেপশন হ্যান্ডলিং

এখন, এক্সসেপশন হ্যান্ডলিং করার জন্য, আমরা @ControllerAdvice ব্যবহার করব। এটি একটি গ্লোবাল এক্সসেপশন হ্যান্ডলার হিসেবে কাজ করবে, যা সমস্ত কন্ট্রোলারেই এক্সসেপশন হ্যান্ডলিং করবে।

package com.example.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
public class GlobalExceptionHandler {

    // Handle UserNotFoundException
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    // Handle other exceptions
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGenericException(Exception ex) {
        return new ResponseEntity<>("Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

এখানে:

  • @ExceptionHandler(UserNotFoundException.class) ব্যবহার করে আমরা UserNotFoundException এর জন্য এক্সসেপশন হ্যান্ডলিং করেছি এবং একটি 404 Not Found রেসপন্স পাঠিয়েছি।
  • @ExceptionHandler(Exception.class) ব্যবহার করে আমরা অন্যান্য এক্সসেপশনগুলোর জন্য একটি সাধারণ হ্যান্ডলার তৈরি করেছি, যা 500 Internal Server Error রেসপন্স পাঠাবে।

২. @ResponseStatus ব্যবহার

স্প্রিং বুটে @ResponseStatus অ্যানোটেশন ব্যবহার করে আপনি এক্সসেপশন ঘটলে সরাসরি HTTP স্ট্যাটাস কোড সেট করতে পারেন। এটি বিশেষভাবে সুবিধাজনক যখন আপনি কাস্টম এক্সসেপশন তৈরি করতে চান এবং সেটির জন্য HTTP স্ট্যাটাস কোড নির্ধারণ করতে চান।

উদাহরণ:

package com.example.demo.exception;

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

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "User not found")
public class UserNotFoundException extends RuntimeException {

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

এখন, UserNotFoundException এক্সসেপশন থ্রো হলে এটি স্বয়ংক্রিয়ভাবে 404 Not Found স্ট্যাটাস কোড সহ রেসপন্স পাঠাবে।


৩. Validation এক্সসেপশন হ্যান্ডলিং

যখন আপনি ডেটা ভ্যালিডেশন (যেমন, @NotNull, @Size, ইত্যাদি) ব্যবহার করেন, তখন যদি কোনো ভ্যালিডেশন ব্যর্থ হয়, তখন সাধারণত MethodArgumentNotValidException এক্সসেপশন ঘটে। আপনি এই এক্সসেপশনটিও হ্যান্ডল করতে পারেন।

উদাহরণ:

package com.example.demo.controller;

import com.example.demo.model.User;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @PostMapping
    public User createUser(@RequestBody @Valid User user, BindingResult result) {
        if (result.hasErrors()) {
            throw new UserNotValidException("Invalid user data");
        }
        // Save user logic
        return user;
    }
}

এখন, UserNotValidException এক্সসেপশন হ্যান্ডলিং করতে হবে:

package com.example.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(UserNotValidException.class)
    public ResponseEntity<String> handleValidationException(UserNotValidException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

উপসংহার

স্প্রিং বুটের এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে আপনি অ্যাপ্লিকেশনটির ত্রুটি সঠিকভাবে পরিচালনা করতে পারেন এবং ব্যবহারকারীকে অর্থপূর্ণ ত্রুটি বার্তা প্রদান করতে পারেন। @ControllerAdvice এবং @ExceptionHandler এর মাধ্যমে আমরা গ্লোবাল এবং নির্দিষ্ট এক্সসেপশন হ্যান্ডলিং করতে পারি। এছাড়া, @ResponseStatus এবং ভ্যালিডেশন এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে কোড আরও কার্যকরী ও পরিষ্কার করা যায়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion