Exception handling (অপবাদ হ্যান্ডলিং) হল এমন একটি প্রক্রিয়া যেখানে সিস্টেমের চলার সময় যে কোনো ভুল বা অস্বাভাবিক পরিস্থিতি মোকাবিলা করা হয়। স্প্রিং বুটে এক্সসেপশন হ্যান্ডলিং একটি গুরুত্বপূর্ণ বিষয়, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ইউজার এক্সপেরিয়েন্স উন্নত করতে সহায়তা করে।
স্প্রিং বুটে exception handling কিভাবে কাজ করবে তা বিভিন্ন কৌশলে করা যায়, যেমন:
স্প্রিং বুট নিজেই কিছু সাধারণ এক্সসেপশন (যেমন 404 Not Found
, 400 Bad Request
ইত্যাদি) হ্যান্ডল করে থাকে, তবে কাস্টম এক্সসেপশন এবং এর রেসপন্স ম্যানেজ করার জন্য বিশেষ কৌশল ব্যবহৃত হয়।
স্প্রিং বুটে প্রতিটি কন্ট্রোলারের মধ্যে এক্সসেপশন হ্যান্ডলিং করা যায়। এই ক্ষেত্রে, আমরা @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, যা একটি সেন্ট্রালাইজড অবস্থানে সমস্ত এক্সসেপশন হ্যান্ডল করতে সহায়তা করে। এর জন্য @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
ব্যবহার করে নির্দিষ্ট এক্সসেপশন বা সাধারণ এক্সসেপশন হ্যান্ডল করা হয়েছে।স্প্রিং বুটের মধ্যে আপনি নিজের কাস্টম এক্সসেপশনও তৈরি করতে পারেন। একটি কাস্টম এক্সসেপশন তৈরি করতে আপনাকে সাধারণত RuntimeException
অথবা Exception
ক্লাস এক্সটেন্ড করতে হবে।
public class EmployeeNotFoundException extends RuntimeException {
public EmployeeNotFoundException(String message) {
super(message);
}
}
এখানে, EmployeeNotFoundException
কাস্টম এক্সসেপশন ক্লাস তৈরি করা হয়েছে যা RuntimeException
এক্সটেন্ড করে।
এক্সসেপশন হ্যান্ডলিং করার সময় অনেক সময় আপনি কাস্টম এরর রেসপন্স ফর্ম্যাট তৈরি করতে চাইবেন। এটি বিশেষ করে 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 অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের ত্রুটিগুলো সঠিকভাবে হ্যান্ডল করতে সাহায্য করে। আপনি কন্ট্রোলার লেভেল, গ্লোবাল লেভেল, অথবা কাস্টম এক্সসেপশন তৈরি করে একটি সিস্টেমের জন্য সঠিক এক্সসেপশন হ্যান্ডলিং কৌশল নির্বাচন করতে পারেন। এর মাধ্যমে অ্যাপ্লিকেশনটি ত্রুটিপূর্ণ পরিস্থিতি সঠিকভাবে ম্যানেজ করে এবং ইউজারকে পরিষ্কার এবং সঠিক তথ্য প্রদান করে।
Spring Boot অ্যাপ্লিকেশনে Exception Handling খুবই গুরুত্বপূর্ণ, কারণ এটি ব্যবহারকারী বা ক্লায়েন্টকে অ্যাপ্লিকেশনের যে কোনো ত্রুটি বা অপ্রত্যাশিত পরিস্থিতি সম্পর্কে সঠিক এবং সুসংগঠিত বার্তা প্রদান করতে সহায়তা করে। একটি শক্তিশালী Exception Handling সিস্টেম অ্যাপ্লিকেশনটিকে আরও নির্ভরযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
চলুন দেখে নেওয়া যাক কেন Spring Boot অ্যাপ্লিকেশনগুলিতে Exception Handling এর প্রয়োজনীয়তা রয়েছে এবং এটি কীভাবে কার্যকরী হতে পারে।
Exception Handling অ্যাপ্লিকেশনকে স্থিতিশীল (stable) এবং নির্ভরযোগ্য (reliable) রাখে। কোনো অপ্রত্যাশিত ত্রুটি বা ব্যতিক্রম (exception) ঘটলে, সেটি যথাযথভাবে হ্যান্ডেল করা প্রয়োজন। যদি এই ত্রুটিগুলো হ্যান্ডেল না করা হয়, তাহলে অ্যাপ্লিকেশন ক্র্যাশ বা বন্ধ হয়ে যেতে পারে। এর ফলে, ব্যবহারকারীরা অ্যাপ্লিকেশন ব্যবহার করতে পারবেন না।
Spring Boot তে সেন্ট্রালাইজড Exception Handling ব্যবহারের মাধ্যমে, আপনি সমস্ত ব্যতিক্রমের জন্য একটি সাধারণ সিস্টেম তৈরি করতে পারেন, যা অ্যাপ্লিকেশনকে স্থিতিশীল রাখে।
Exception Handling এর মাধ্যমে, আপনি ক্লায়েন্ট বা ব্যবহারকারীকে সঠিক এবং পরিষ্কার ত্রুটি বার্তা প্রদান করতে পারেন। যেমন, HTTP স্ট্যাটাস কোড এবং কাস্টম ত্রুটি বার্তা রিটার্ন করে, যা ব্যবহারকারীর কাছে আরও কার্যকরী এবং সহজবোধ্য হয়।
যেমন:
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 করার জন্য বিভিন্ন কৌশল রয়েছে। কিছু সাধারণ কৌশল হলো:
@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 অ্যাপ্লিকেশনের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করে, যা একে আরও শক্তিশালী এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
Spring Boot অ্যাপ্লিকেশন তৈরি করার সময়, ভুল (exception) হ্যান্ডলিং একটি গুরুত্বপূর্ণ অংশ। যখনই কোনো ত্রুটি বা ব্যতিক্রম ঘটে, তখন সেই ত্রুটির সঠিকভাবে হ্যান্ডলিং করা দরকার, যাতে অ্যাপ্লিকেশন নির্বিঘ্নে চলতে পারে এবং ব্যবহারকারীকে উপযুক্ত তথ্য প্রদান করা যায়। Spring Framework এই সমস্যা সমাধানের জন্য দুটি গুরুত্বপূর্ণ অ্যানোটেশন প্রদান করেছে: @ControllerAdvice
এবং @ExceptionHandler
।
এই টিউটোরিয়ালে, আমরা @ControllerAdvice
এবং @ExceptionHandler
এর ব্যবহার বিস্তারিতভাবে আলোচনা করব।
@ControllerAdvice
হল একটি স্প্রিং অ্যানোটেশন যা গ্লোবাল (বিশ্বব্যাপী) এক্সসেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি সমস্ত কন্ট্রোলার ক্লাসে সংঘটিত ব্যতিক্রমগুলোকে একটি একক পয়েন্ট থেকে হ্যান্ডল করতে সাহায্য করে। একে একটি সেন্ট্রাল প্লেস হিসেবে ব্যবহার করা হয়, যেখানে আপনি সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিংয়ের কাস্টমাইজড পদ্ধতি নির্ধারণ করতে পারেন।
@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
অ্যানোটেশনটি ব্যবহৃত হয় এক বা একাধিক নির্দিষ্ট ব্যতিক্রম (exception) হ্যান্ডল করার জন্য। এটি কেবলমাত্র নির্দিষ্ট কন্ট্রোলার ক্লাসের মধ্যে কার্যকরী, কিন্তু যখন এটি @ControllerAdvice
এর সাথে ব্যবহার করা হয়, তখন এটি গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।
@ExceptionHandler
শুধুমাত্র সেই এক্সসেপশন হ্যান্ডল করে, যা মেথডে উল্লেখ করা হয়।@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 রেসপন্স ফিরিয়ে দেবে।
@ExceptionHandler
একটি নির্দিষ্ট এক্সসেপশন ক্লাসের জন্য এবং @ControllerAdvice
সমস্ত কন্ট্রোলারে এক্সসেপশন হ্যান্ডল করার জন্য ব্যবহৃত হয়।@ControllerAdvice
হল একটি গ্লোবাল সেন্ট্রাল পয়েন্ট যা একাধিক কন্ট্রোলারের এক্সসেপশন হ্যান্ডল করতে পারে, যেখানে @ExceptionHandler
নির্দিষ্ট কন্ট্রোলারের মধ্যে ব্যবহৃত হয় এবং শুধুমাত্র নির্দিষ্ট এক্সসেপশন হ্যান্ডল করে।Spring Boot অ্যাপ্লিকেশনে @ControllerAdvice
এবং @ExceptionHandler
ব্যতিক্রম (exception) হ্যান্ডলিংয়ের জন্য অত্যন্ত শক্তিশালী সরঞ্জাম। @ControllerAdvice
গ্লোবালভাবে ব্যতিক্রম হ্যান্ডল করার জন্য ব্যবহৃত হয় এবং @ExceptionHandler
এক বা একাধিক নির্দিষ্ট ব্যতিক্রমের জন্য ব্যবহৃত হয়। এই দুটি অ্যানোটেশন ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনে সব ধরনের ত্রুটি এবং ব্যতিক্রম কার্যকরীভাবে হ্যান্ডল করতে পারবেন এবং ব্যবহারকারীদের জন্য কাস্টম ত্রুটি বার্তা বা HTTP রেসপন্স পাঠাতে পারবেন।
স্প্রিং বুট (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
কাস্টম এক্সসেপশন থ্রো করা হবে, এবং এটি গ্লোবাল এক্সসেপশন হ্যান্ডলার দ্বারা হ্যান্ডল হবে।
স্প্রিং বুটের কাস্টম এক্সসেপশন আরো কাস্টমাইজ করা যেতে পারে যেমন:
স্প্রিং বুটে কাস্টম এক্সসেপশন তৈরি এবং হ্যান্ডল করা খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনের ত্রুটিগুলিকে স্পষ্টভাবে এবং কার্যকরভাবে পরিচালনা করতে সাহায্য করে। কাস্টম এক্সসেপশন এবং গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের মাধ্যমে আপনি কোডের গঠন উন্নত করতে পারেন এবং ডিবাগিং প্রক্রিয়াকে আরও সহজ করতে পারেন।
স্প্রিং বুট (Spring Boot) অ্যাপ্লিকেশনগুলিতে এক্সসেপশন হ্যান্ডলিং একটি অত্যন্ত গুরুত্বপূর্ণ দিক, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করে। এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে আমরা একটি পরিষ্কার এবং অর্থপূর্ণ ত্রুটি বার্তা প্রদান করতে পারি, যা ডেভেলপারদের জন্য ডিবাগিং এবং ব্যবহারকারীদের জন্য সমস্যা সমাধান সহজ করে তোলে।
স্প্রিং বুটে এক্সসেপশন হ্যান্ডলিং করার জন্য কিছু গুরুত্বপূর্ণ কৌশল রয়েছে, যেমন @ControllerAdvice
, @ExceptionHandler
, এবং কাস্টম এক্সসেপশন তৈরি করা। এখানে আমরা একটি উদাহরণের মাধ্যমে স্প্রিং বুট অ্যাপ্লিকেশন থেকে এক্সসেপশন হ্যান্ডলিং কিভাবে করা যায় তা দেখব।
স্প্রিং বুট অ্যাপ্লিকেশনে এক্সসেপশন হ্যান্ডলিং করার জন্য আমরা সাধারণত @ExceptionHandler
এবং @ControllerAdvice
ব্যবহার করি। এখানে আমরা একটি উদাহরণ দেখব যেখানে একটি সাধারণ UserNotFoundException
এক্সসেপশন তৈরি করা হবে এবং এটি কিভাবে হ্যান্ডেল করা যায় তা দেখানো হবে।
প্রথমে আমাদের একটি কাস্টম এক্সসেপশন তৈরি করতে হবে। এটি এমন একটি এক্সসেপশন হবে যা ব্যবহারকারী না পাওয়া গেলে থ্রো করা হবে।
package com.example.demo.exception;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
এখানে UserNotFoundException
একটি রানটাইম এক্সসেপশন, যা ব্যবহারকারী না পাওয়া গেলে ছোড়া হবে।
এখন, কন্ট্রোলারে আমরা 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
থ্রো হবে।
এখন, এক্সসেপশন হ্যান্ডলিং করার জন্য, আমরা @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
অ্যানোটেশন ব্যবহার করে আপনি এক্সসেপশন ঘটলে সরাসরি 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
স্ট্যাটাস কোড সহ রেসপন্স পাঠাবে।
যখন আপনি ডেটা ভ্যালিডেশন (যেমন, @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
এবং ভ্যালিডেশন এক্সসেপশন হ্যান্ডলিং এর মাধ্যমে কোড আরও কার্যকরী ও পরিষ্কার করা যায়।
Read more