Eclipse IDE-এ EJB (Enterprise JavaBeans)-এ Exception Handling একটি গুরুত্বপূর্ণ দিক, কারণ Enterprise Applications-এ প্রায়ই একাধিক এক্সেপশন ধরনের সাথে কাজ করতে হয়। EJB ব্যবহারের সময় আপনি Checked এবং Unchecked Exceptions উভয়ই পরিচালনা করবেন, এবং সেগুলি সঠিকভাবে ট্রানজেক্টিভ ব্যবস্থাপনা, রোলব্যাক, বা পুনঃপ্রক্রিয়া করার জন্য সঠিকভাবে হ্যান্ডেল করা প্রয়োজন।
এই গাইডে, আমরা EJB-এ Exception Handling এবং এর বিভিন্ন কৌশল আলোচনা করব, যেমন @TransactionAttribute, Exception Mapping, এবং Rollback ব্যবস্থাপনা।
1. Exception Handling in EJB
EJB-তে এক্সেপশন হ্যান্ডলিংয়ের মূল উদ্দেশ্য হলো Transaction Management, Error Propagation, এবং Recovery নিশ্চিত করা। EJB Container সাধারণত Checked Exceptions এবং Unchecked Exceptions হ্যান্ডল করার জন্য কিছু স্ট্যান্ডার্ড পদ্ধতি সরবরাহ করে।
1.1. Checked Exceptions vs Unchecked Exceptions
- Checked Exceptions: এই ধরনের এক্সেপশনগুলিকে মেথডের সিগনেচারে ঘোষণা করতে হয়, এবং আপনি এগুলি হ্যান্ডল না করলে কম্পাইলার ত্রুটি দেখাবে। উদাহরণস্বরূপ:
IOException,SQLException। - Unchecked Exceptions: এই এক্সেপশনগুলি রানটাইম সময়ে ঘটে এবং এগুলিকে মেথড সিগনেচারে ঘোষণা করার প্রয়োজন নেই। উদাহরণস্বরূপ:
NullPointerException,ArrayIndexOutOfBoundsException।
1.2. Handling Exceptions in EJB Methods
EJB মেথডে এক্সেপশন হ্যান্ডলিং সাধারাণত দুটি উপায়ে করা যায়:
- Throws Clause: EJB মেথডে এক্সেপশন ঘোষণা করে যেগুলি ক্যাচ করতে হবে না।
- Exception Handling with @TransactionAttribute: @TransactionAttribute ব্যবহার করে ট্রানজেকশন পরিচালনার সময় এক্সেপশন হ্যান্ডলিং নিশ্চিত করা।
2. @TransactionAttribute and Exception Handling
@TransactionAttribute ব্যবহার করে আপনি EJB মেথডের ট্রানজেকশন আচরণ কাস্টমাইজ করতে পারেন। বিশেষ করে, আপনি যদি transaction rollback করতে চান তখন ট্রানজেকশনের আচরণ @TransactionAttribute দ্বারা কনফিগার করতে হবে।
@TransactionAttribute Types for Exception Handling
- REQUIRED: মেথডটি যদি কোনো ট্রানজেকশন ছাড়া চলে, তবে এটি একটি নতুন ট্রানজেকশন শুরু করবে। যদি কোনো এক্সেপশন ঘটে, তবে তা ট্রানজেকশন রোলব্যাক করবে।
- REQUIRES_NEW: একটি নতুন ট্রানজেকশন শুরু করবে এবং এক্সেপশন ঘটলে রোলব্যাক করবে।
- MANDATORY: মেথডটির জন্য একটি চলমান ট্রানজেকশন থাকা প্রয়োজন। যদি চলমান ট্রানজেকশন না থাকে, তবে
IllegalStateExceptionছুড়ে দিবে। - NEVER: কোনো ট্রানজেকশন ছাড়াই মেথডটি রান করবে। যদি কোনো ট্রানজেকশন চলমান থাকে, তবে
IllegalStateExceptionছুড়ে দিবে। - NOT_SUPPORTED: ট্রানজেকশন সাসপেন্ড করবে এবং মেথডটি ট্রানজেকশন ছাড়া সম্পন্ন হবে।
3. Rollback Behavior and @TransactionAttribute
@TransactionAttribute-এর সাথে rollback behavior নির্ধারণ করা যায়। EJB এর মধ্যে transaction rollback এর জন্য একটি বিশেষ অ্যানোটেশন @TransactionAttributeType ব্যবহার করা হয়, যা EJB মেথডে এক্সেপশন ঘটলে ট্রানজেকশন রোলব্যাক করতে সহায়তা করে।
Step 1: Rollback on Specific Exception
@TransactionAttribute এর মাধ্যমে আপনি নির্দিষ্ট এক্সেপশনগুলির জন্য রোলব্যাক নির্ধারণ করতে পারেন।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.RollbackException;
@Stateless
public class AccountService {
@PersistenceContext
private EntityManager entityManager;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transferMoney(Account fromAccount, Account toAccount, double amount) {
if (amount <= 0) {
throw new IllegalArgumentException("Amount should be greater than zero");
}
// Proceed with transaction
fromAccount.withdraw(amount);
toAccount.deposit(amount);
entityManager.merge(fromAccount);
entityManager.merge(toAccount);
// Simulating a business rule failure to demonstrate rollback
if (amount > fromAccount.getBalance()) {
throw new RollbackException("Insufficient balance");
}
}
}
এখানে, @TransactionAttribute(TransactionAttributeType.REQUIRED) ব্যবহার করা হয়েছে এবং RollbackException ছুড়ে দিলে ট্রানজেকশন রোলব্যাক হবে।
Step 2: Rollback on All Runtime Exceptions
আপনি যদি চান যে যেকোনো Runtime Exception ঘটলে ট্রানজেকশন রোলব্যাক হোক, তবে @TransactionAttribute এর সাথে @Rollback নির্দিষ্ট করতে হবে।
Example:
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class ProductService {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void updateProductQuantity(Product product, int quantity) {
try {
if (quantity < 0) {
throw new IllegalArgumentException("Quantity cannot be negative");
}
product.setQuantity(quantity);
} catch (RuntimeException e) {
// Automatically trigger a rollback on runtime exceptions
throw e;
}
}
}
এখানে RuntimeException ঘটলে, ট্রানজেকশনটি Rollback হবে।
4. Exception Mapping in EJB
EJB-তে Exception Mapping কৌশলটি এক্সেপশনগুলোকে একটি কাঙ্ক্ষিত ফরম্যাটে ম্যাপ করতে ব্যবহৃত হয়। বিশেষ করে, যখন আপনি client-exception এবং server-exception গুলিকে ডিফাইন করতে চান।
Mapping Server Exceptions to Client Exceptions
EJB ডেভেলপমেন্টে, সাধারণত, আপনি remote exceptions এবং local exceptions ম্যাপ করতে পারেন। Remote Exception সাধারণত ক্লায়েন্ট থেকে সিস্টেমের মধ্যে প্রেরিত হয় এবং local exception ক্লায়েন্টের বাইরে থাকে।
Example: Exception Mapping
import javax.ejb.ApplicationException;
@ApplicationException(rollback = true)
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
এখানে, @ApplicationException অ্যানোটেশনটি নির্দেশ করে যে এই এক্সেপশনটি rollback ঘটাবে।
5. Advanced Exception Handling in EJB
EJB-তে কিছু উন্নত এক্সেপশন হ্যান্ডলিং কৌশল রয়েছে, যা আপনাকে আরও নিয়ন্ত্রিত ভাবে কোডের মধ্যে এক্সেপশনগুলো পরিচালনা করতে সহায়তা করবে। Container Managed Transactions এবং Managed Exceptions সহ বিভিন্ন প্রযুক্তি ব্যবহার করা যেতে পারে।
5.1. @ApplicationException Annotation
এটি EJB-তে এক্সেপশনগুলোকে ম্যাপ এবং কাস্টমাইজ করার জন্য ব্যবহৃত হয়। @ApplicationException অ্যানোটেশনটি এটি নির্দেশ করে যে এই এক্সেপশনটি EJB Container-এ প্রয়োগ হতে পারে এবং ট্রানজেকশন রোলব্যাক করতে সহায়তা করে।
5.2. Catching and Rethrowing Exceptions
এক্সেপশনগুলি কখনো কখনো ইন্টারনাল বা অন্য মেথড থেকে আসতে পারে, যা ক্লায়েন্টের কাছে পুনঃপ্রেরণ করার আগে প্রক্রিয়া করতে হবে।
@Stateless
public class ProductService {
public void updateProductPrice(Product product, double price) {
try {
if (price < 0) {
throw new InvalidPriceException("Price cannot be negative");
}
product.setPrice(price);
} catch (InvalidPriceException e) {
// Log and rethrow the exception
throw e; // Rethrow the exception to trigger rollback
}
}
}
এখানে, InvalidPriceException ক্লায়েন্টকে পাঠানো হয়েছে এবং এক্সেপশনটি রোলব্যাক নিশ্চিত করা হয়েছে।
EJB Exception Handling Java EE (Jakarta EE) অ্যাপ্লিকেশনের গুরুত্বপূর্ণ অংশ। এটি transaction management এবং error handling নিশ্চিত করতে ব্যবহৃত হয়। @TransactionAttribute এবং Exception Mapping এর মাধ্যমে আপনি সহজেই এক্সেপশনগুলো হ্যান্ডল করতে পারবেন এবং প্রয়োজনীয় কার্যকলাপ বা রোলব্যাক নিশ্চিত করতে পারবেন।
- @TransactionAttribute ব্যবহার করে আপনি ট্রানজেকশন আচরণ কাস্টমাইজ করতে পারেন।
- Exception Mapping এবং @ApplicationException ব্যবহার করে, আপনি ইন্টারনাল বা ক্লায়েন্ট এক্সেপশন হ্যান্ডলিং ও ট্রানজেকশন রোলব্যাক নিশ্চিত করতে পারবেন।
এই কৌশলগুলি আপনার EJB প্রোজেক্টের এক্সেপশন হ্যান্ডলিংকে আরও কার্যকরী এবং নির্ভরযোগ্য করে তুলবে।
EJB (Enterprise JavaBeans) একটি Java EE (Jakarta EE) ভিত্তিক টেকনোলজি যা ক্লায়েন্ট-সার্ভার অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য ব্যবহৃত হয়। EJB এর মাধ্যমে আপনি সিকিউরিটি, ট্রানজেকশন ম্যানেজমেন্ট এবং কনকারেন্সি ম্যানেজমেন্ট সহজেই পরিচালনা করতে পারেন। তবে, যখন আপনি একটি অ্যাপ্লিকেশন তৈরি করেন, তখন সঠিকভাবে Exception Handling করার গুরুত্ব অপরিসীম, কারণ এটি অ্যাপ্লিকেশনের স্থিতিশীলতা এবং নির্ভরযোগ্যতা নিশ্চিত করতে সাহায্য করে।
EJB তে Exception Handling দুটি ধরনের হতে পারে:
- Application Exception (অ্যাপ্লিকেশন এক্সেপশন): বিশেষত, ব্যবসায়িক লজিক বা প্রোগ্রামের জন্য নির্ধারিত এক্সেপশন।
- System Exception (সিস্টেম এক্সেপশন): JEE কন্টেইনার দ্বারা সৃষ্ট এক্সেপশন যেমন, ট্রানজেকশন সংক্রান্ত বা সিস্টেম ইরর।
এখানে, আমরা EJB তে Exception Handling সম্পর্কে বিস্তারিত আলোচনা করব এবং বিভিন্ন ধরনের এক্সেপশন কিভাবে হ্যান্ডেল করতে হয় তা দেখাবো।
1. EJB Exception Handling:
EJB তে exception handling দুই ধরনের এক্সেপশন কভার করে:
- Application Exceptions: এটি ক্লায়েন্ট বা ডেভেলপার দ্বারা তৈরি করা এক্সেপশন যা সাধারণত ব্যবসায়িক বা ডোমেইন লজিকের জন্য ব্যবহৃত হয়।
- System Exceptions: এটি JEE কন্টেইনার দ্বারা তৈরি করা এক্সেপশন, যেমন কন্টেইনার-সংশ্লিষ্ট ত্রুটি (ট্রানজেকশন ইরর, সিকিউরিটি এক্সেপশন ইত্যাদি)।
System Exception Handling:
System Exception গুলি runtime exception হিসেবে দেখা যায়। EJB কন্টেইনার স্বয়ংক্রিয়ভাবে System Exception গুলিকে রোলব্যাক করে।
যেমন:
RemoteExceptionEJBExceptionTransactionRolledbackExceptionIllegalStateException
Application Exception Handling:
Application Exception গুলি checked exceptions হিসেবে দেখা যায় এবং এগুলি কাস্টম ক্লাসের মাধ্যমে ডিফাইন করা যায়। এই এক্সেপশনগুলিকে ডেভেলপার নিজেই হ্যান্ডেল করতে পারে।
যেমন:
BusinessExceptionValidationException
2. EJB তে Exception Handling এর সাধারণ ধারণা:
EJB তে এক্সেপশন হ্যান্ডলিং সাধারণত দুইটি কৌশল ব্যবহৃত হয়:
Declarative Exception Handling:
EJB কন্টেইনারের declarative exception handling ব্যবস্থায় @TransactionManagement এবং @TransactionAttribute অ্যানোটেশন ব্যবহার করে এক্সেপশন হ্যান্ডলিং করা যায়। এতে কোন কোড লেখা ছাড়াই, শুধুমাত্র কনফিগারেশন দ্বারা এক্সেপশন ম্যানেজ করা হয়।
Programmatic Exception Handling:
এটি EJB তে কোড লিখে try-catch blocks ব্যবহার করে এক্সেপশন ম্যানেজ করার প্রক্রিয়া। এখানে ডেভেলপার নিজেই এক্সেপশন হ্যান্ডলিং পরিচালনা করেন।
3. EJB Exception Handling: Programmatic Approach
এখানে Programmatic Exception Handling এর একটি উদাহরণ দেওয়া হলো যেখানে try-catch ব্লক ব্যবহার করে কাস্টম exception হ্যান্ডলিং করা হয়েছে।
Step 1: Application Exception (Business Exception)
package com.example.ejb;
public class BusinessException extends Exception {
public BusinessException(String message) {
super(message);
}
}
এখানে BusinessException একটি কাস্টম exception ক্লাস তৈরি করা হয়েছে যা ব্যবসায়িক লজিকের ত্রুটি চিহ্নিত করবে।
Step 2: EJB Bean (Stateful Session Bean)
package com.example.ejb;
import javax.ejb.Stateful;
import javax.ejb.EJBException;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateful
public class ShoppingCartBean {
private int itemCount = 0;
// Method to add an item to the shopping cart
public void addItem(int quantity) throws BusinessException {
if (quantity <= 0) {
throw new BusinessException("Invalid quantity, must be greater than zero.");
}
itemCount += quantity;
}
// Method to get the current item count
public int getItemCount() {
return itemCount;
}
// Example of catching system exception and throwing application exception
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void checkout() {
try {
// Some logic that could cause an exception
if (itemCount == 0) {
throw new EJBException("Cart is empty, cannot checkout.");
}
} catch (EJBException ex) {
throw new BusinessException("Checkout failed: " + ex.getMessage());
}
}
}
এখানে, addItem() মেথডে যদি কোনো ভুল পরিমাণ দেওয়া হয়, তাহলে একটি BusinessException ছোঁড়া হবে। এছাড়া, checkout() মেথডে EJBException হ্যান্ডেল করা হচ্ছে এবং তার ভিত্তিতে একটি কাস্টম BusinessException ছোঁড়া হচ্ছে।
Step 3: Client Code (EJB Client)
package com.example.client;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.example.ejb.ShoppingCartBean;
import com.example.ejb.BusinessException;
public class ShoppingCartClient {
public static void main(String[] args) {
try {
// JNDI Lookup to access the ShoppingCartBean
Context context = new InitialContext();
ShoppingCartBean shoppingCart = (ShoppingCartBean) context.lookup("java:global/myapp/ShoppingCartBean");
// Add item to cart
shoppingCart.addItem(5); // Valid case
// Add invalid item (throws exception)
shoppingCart.addItem(-1); // Invalid quantity
} catch (BusinessException e) {
e.printStackTrace(); // Handle business exception
} catch (Exception e) {
e.printStackTrace(); // Handle other exceptions
}
}
}
এখানে, ShoppingCartClient ক্লায়েন্ট অ্যাপ্লিকেশন addItem মেথডটি কল করছে এবং যদি কোনো BusinessException হয়, তাহলে সেটা catch করা হচ্ছে এবং যথাযথভাবে হ্যান্ডল করা হচ্ছে।
4. EJB Exception Handling: Declarative Approach
EJB তে Declarative Exception Handling ব্যবহারের জন্য @TransactionAttribute অ্যানোটেশন এবং @TransactionManagement অ্যানোটেশন ব্যবহার করা হয়, যা ট্রানজেকশন সাপোর্ট করে এবং প্রোগ্রামিং লেভেলে এক্সেপশন ম্যানেজমেন্টের প্রক্রিয়াটি সহজ করে।
Declarative Exception Handling Example:
package com.example.ejb;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class OrderProcessingBean {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void processOrder(Order order) throws BusinessException {
if (order == null || order.getItems().isEmpty()) {
throw new BusinessException("Order is invalid: no items.");
}
// Further processing...
}
}
এখানে, @TransactionAttribute(TransactionAttributeType.REQUIRED) অ্যানোটেশনটি ব্যবহার করা হয়েছে যাতে ট্রানজেকশনটি শুধুমাত্র প্রয়োজনীয় যখন থাকে তখনই শুরু হয় এবং যদি কোনো এক্সেপশন হয়, তবে ট্রানজেকশন রোলব্যাক হবে।
EJB Exception Handling এর সুবিধা:
- Declarative Exception Handling ডেভেলপারকে কোডের মধ্যে এক্সেপশন ম্যানেজমেন্ট করতে সাহায্য করে না, বরং এটি কনফিগারেশন এবং অ্যানোটেশন দ্বারা সহজভাবে করা হয়।
- Programmatic Exception Handling ব্যবহার করে ডেভেলপার নিজে বিভিন্ন এক্সেপশন ট্রিগার এবং হ্যান্ডল করতে পারেন, যা বেশি কাস্টমাইজড এবং নিয়ন্ত্রিত।
- EJB কন্টেইনার স্বয়ংক্রিয়ভাবে System Exceptions হ্যান্ডল করে এবং Application Exceptions প্রোগ্রাম্যাটিকভাবে পরিচালিত হয়।
সারাংশ:
EJB Exception Handling হল এক্সেপশন ম্যানেজমেন্টের জন্য একটি শক্তিশালী প্রক্রিয়া, যা Declarative এবং Programmatic দুটি পদ্ধতিতে করা যায়। Declarative পদ্ধতিতে অ্যানোটেশন বা কনফিগারেশন দ্বারা এক্সেপশন ম্যানেজমেন্ট করা হয়, যা কোডকে সহজ এবং পরিষ্কার রাখে। অন্যদিকে, Programmatic পদ্ধতিতে ডেভেলপার নিজে কোড লিখে এক্সেপশন ম্যানেজমেন্ট করতে পারে, যা অধিক কাস্টমাইজেশন এবং নিয়ন্ত্রণ প্রদান করে।
Java এবং EJB (Enterprise JavaBeans) এর মধ্যে, Application Exception এবং System Exception দুটি পৃথক ধরনের এক্সেপশন। এই দুই ধরনের এক্সেপশনটি বিভিন্ন ধরনের ত্রুটি পরিস্থিতি চিহ্নিত করতে ব্যবহৃত হয় এবং তাদের আচরণও আলাদা।
নিচে Application Exception এবং System Exception এর মধ্যে পার্থক্য সম্পর্কে বিস্তারিত আলোচনা করা হলো:
1. Application Exception
Application Exception হল একটি Checked Exception, যা অ্যাপ্লিকেশন স্তরের ত্রুটি বোঝায়। এটি ব্যবহারকারীর দ্বারা ডিফাইন করা হতে পারে এবং সাধারণত অ্যাপ্লিকেশন-নির্দিষ্ট পরিস্থিতির কারণে ঘটে। এগুলি সেই সমস্ত ত্রুটি যা একটি নির্দিষ্ট অ্যাপ্লিকেশন বা বাণিজ্যিক লজিকের মধ্যে ঘটতে পারে।
Application Exception এর বৈশিষ্ট্য:
- Checked Exception: Application Exception সাধারণত checked exception হিসাবে চিহ্নিত করা হয়। এর মানে হল যে, এটি ডেভেলপারকে ব্যাবহার করতে হবে, এবং এটি কম্পাইল টাইমে হ্যান্ডেল করা বাধ্যতামূলক।
- ব্যবহারকারী-নির্দিষ্ট ত্রুটি: অ্যাপ্লিকেশন সম্পর্কিত সমস্যা যেমন ব্যাবহারকারী ভুল ইনপুট, বৈধতা যাচাইয়ের ত্রুটি, অথবা প্রক্রিয়া-নির্ভর ত্রুটির জন্য এই এক্সেপশনটি ব্যবহৃত হয়।
- Explicitly thrown: এই ধরনের এক্সেপশনগুলো সাধারণত অ্যাপ্লিকেশন কোড দ্বারা explicitভাবে (অর্থাৎ
throwকরা হয়) ফেলে দেওয়া হয়।
Application Exception উদাহরণ:
ধরা যাক, একটি InvalidInputException যা একটি অ্যাপ্লিকেশন-নির্দিষ্ট ত্রুটি, যদি ব্যবহারকারী ভুল ইনপুট প্রদান করে:
public class InvalidInputException extends Exception {
public InvalidInputException(String message) {
super(message);
}
}
এখানে, InvalidInputException একটি অ্যাপ্লিকেশন এক্সেপশন, যা অ্যাপ্লিকেশন লজিকের অংশ হিসেবে ব্যাবহার করা হয় এবং এটি কার্যকরভাবে হ্যান্ডল করতে হবে।
2. System Exception
System Exception হল একটি Unchecked Exception, যা সিস্টেম বা জাভা রানটাইম সম্পর্কিত ত্রুটিগুলিকে নির্দেশ করে। এগুলি সাধারণত জাভা রানটাইম বা সিস্টেম সম্পর্কিত ত্রুটির কারণে ঘটে, যেমন মেমরি সমস্যাগুলি, I/O ত্রুটি, বা অন্যান্য সিস্টেম স্তরের সমস্যা। সিস্টেম এক্সেপশনগুলো অ্যাপ্লিকেশন থেকে সম্পর্কিত নয় এবং সাধারণত ডেভেলপারকে এটি হ্যান্ডল করতে বাধ্য করা হয় না।
System Exception এর বৈশিষ্ট্য:
- Unchecked Exception: System Exception সাধারণত unchecked exception হিসেবে চিহ্নিত হয়। এর মানে হল যে, এটি runtime exception হিসেবে ডিফাইন করা হয় এবং ডেভেলপারকে এক্সেপশন হ্যান্ডলিং করতে বাধ্য করা হয় না।
- সিস্টেম সম্পর্কিত ত্রুটি: System Exception সাধারণত সিস্টেম স্তরের ত্রুটির জন্য ব্যবহৃত হয়, যেমন NullPointerException, ArrayIndexOutOfBoundsException, IOException ইত্যাদি।
- Implicitly thrown: এগুলি সাধারণত Java Runtime Environment (JRE) বা JVM দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয় এবং ফেলা হয়।
System Exception উদাহরণ:
public class MyApplication {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // NullPointerException occurs here
}
}
এখানে, NullPointerException একটি System Exception, যা সিস্টেম সম্পর্কিত ত্রুটি যা সাধারণত জাভা রানটাইম দ্বারা ফেলা হয় এবং অ্যাপ্লিকেশন লজিকের সমস্যা নির্দেশ করে না।
Application Exception এবং System Exception এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Application Exception | System Exception |
|---|---|---|
| Type | Checked Exception | Unchecked Exception |
| Throwing | Explicitly thrown by application code | Implicitly thrown by JVM or runtime system |
| Cause | Business logic or application-specific issues | System or environment-related issues |
| Example | InvalidInputException, InsufficientFundsException | NullPointerException, ArrayIndexOutOfBoundsException, IOException |
| Handling Requirement | Must be handled or declared in method signature | Not required to be handled explicitly |
| Use Case | Business or application-specific validation or errors | Runtime system failures or JVM-level issues |
| Is it recoverable? | Yes, the application can recover from these exceptions | Typically not recoverable by the application |
সারাংশ:
- Application Exception: এটি অ্যাপ্লিকেশন স্তরের ত্রুটি এবং Checked Exception হিসেবে ব্যবহৃত হয়, যার মানে হলো ডেভেলপারকে এটি হ্যান্ডল করতে হবে।
- System Exception: এটি Unchecked Exception, যা সিস্টেম বা রানটাইম সম্পর্কিত ত্রুটির কারণে ঘটে এবং সাধারণত JRE বা JVM দ্বারা ফেলা হয়। ডেভেলপারকে এগুলি হ্যান্ডল করার জন্য বাধ্য করা হয় না।
- Application Exception সাধারণত অ্যাপ্লিকেশন লজিক বা ব্যবসায়িক লজিকের সাথে সম্পর্কিত হয়, যেখানে System Exception সিস্টেম বা রানটাইম পরিবেশের ত্রুটি নির্দেশ করে।
এভাবে, Application Exception এবং System Exception এর মধ্যে পার্থক্য বুঝে, আপনি আপনার অ্যাপ্লিকেশন ডিজাইন করতে পারেন এবং সঠিকভাবে এক্সেপশন হ্যান্ডলিংয়ের মাধ্যমে আপনার কোডের স্থিতিশীলতা এবং নিরাপত্তা নিশ্চিত করতে পারেন।
EJB (Enterprise JavaBeans) এর মাধ্যমে Exception Mapping এবং Rollback Handling একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। এদের সাহায্যে, EJB কন্টেইনার কাজের মধ্যে সম্ভাব্য ত্রুটি (exception) সনাক্ত এবং পরিচালনা করতে সক্ষম হয়। এর ফলে অ্যাপ্লিকেশনটি আরও স্থিতিশীল এবং নির্ভরযোগ্য হয়।
Exception Mapping এবং Rollback Handling EJB এর সঠিক কার্যকারিতা এবং ডেটাবেস ট্রানজেকশন প্রক্রিয়া নিশ্চিত করতে সহায়ক। এখানে Exception Mapping এবং Rollback Handling সম্পর্কে বিস্তারিত আলোচনা করা হলো।
1. Exception Mapping in EJB
Exception Mapping একটি প্রক্রিয়া যা EJB এর মধ্যে ঘটে যখন কোনো একটি Exception (ত্রুটি) কাস্টমাইজডভাবে পরিচালনা করা হয়। EJB কন্টেইনার স্বয়ংক্রিয়ভাবে EJBException তৈরি করে, কিন্তু আপনি সেই Exception গুলি ম্যানেজ করতে পারেন এবং আপনার প্রয়োজনে custom exceptions তৈরি করতে পারেন।
Exception Mapping এর উদ্দেশ্য:
- EJB তে বিভিন্ন ধরনের application-specific exception তৈরি করা এবং সেগুলির সঠিকভাবে ম্যাপিং করা।
- নির্দিষ্ট exception গুলি পুনঃনির্দেশ (rethrow) করা বা ট্রানজ্যাকশন রোলব্যাক করতে সাহায্য করা।
- Application এর নির্দিষ্ট লজিক অনুযায়ী exception handling করা।
Exception Mapping উদাহরণ:
একটি সাধারণ custom exception তৈরি করা এবং তা @TransactionAttribute এর মাধ্যমে exception mapping করা।
Custom Exception তৈরি করুন:
public class InsufficientFundsException extends Exception { public InsufficientFundsException(String message) { super(message); } }EJB ক্লাসে Exception Mapping:
import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; @Stateless public class BankService { @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void transferFunds(int fromAccount, int toAccount, double amount) throws InsufficientFundsException { // Assume the method checks balance of fromAccount if (amount > 1000) { throw new InsufficientFundsException("Insufficient funds to complete the transfer."); } // Perform transfer logic here... } }Exception Mapping Configuration in
ejb-jar.xml:যদি আপনি exception গুলির জন্য explicit mapping চান, আপনি
ejb-jar.xmlএ exception mapping কনফিগার করতে পারেন। উদাহরণস্বরূপ:<enterprise-beans> <session> <ejb-name>BankService</ejb-name> <exception> <exception-type>com.example.InsufficientFundsException</exception-type> <rollback>true</rollback> </exception> </session> </enterprise-beans>
Explanation:
@TransactionAttribute: ট্যাগটি ব্যবহার করা হয় যাতে ট্রানজ্যাকশন নিয়ন্ত্রণ করা যায় (এখানে REQUIRES_NEW ব্যবহৃত হয়েছে, যার মানে হচ্ছে নতুন একটি ট্রানজ্যাকশন শুরু করা হবে)।- @Rollback: Exception-র ভিত্তিতে ট্রানজ্যাকশন রোলব্যাক করার জন্য ব্যবহৃত হয়।
2. Rollback Handling in EJB
Rollback Handling হল একটি প্রক্রিয়া যার মাধ্যমে একটি ট্রানজ্যাকশন সফল না হলে বা কোনো exception ঘটলে সেই ট্রানজ্যাকশনটি রোলব্যাক (cancel) করা হয়। EJB এ রোলব্যাক ব্যবস্থাপনা সহজে করা যায়, এবং এটি নিশ্চিত করে যে, যদি কোনো ত্রুটি ঘটে তবে ডেটাবেস বা ট্রানজেকশন স্টেট অপরিবর্তিত থাকে।
Rollback Handling এর উদ্দেশ্য:
- যদি কোনো exception ঘটে এবং ট্রানজ্যাকশন সফল না হয়, তাহলে সিস্টেমে কোনো অস্থির বা অসম্পূর্ণ ডেটা রেখে যেতে না হয়।
- সিস্টেমের স্থিতিশীলতা নিশ্চিত করা এবং ডেটার সঠিকতা বজায় রাখা।
- প্রোগ্রাম্যাটিক বা ডিক্লারেটিভভাবে রোলব্যাক পরিচালনা করা।
Rollback Handling উদাহরণ:
Declarative Rollback (ডিক্লারেটিভ রোলব্যাক):
ডিক্লারেটিভ রোলব্যাক করার জন্য, আপনি @TransactionAttribute এবং @TransactionRolledback ব্যবহার করতে পারেন।
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless
public class AccountService {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transferFunds(int fromAccount, int toAccount, double amount) throws InsufficientFundsException {
if (amount > 1000) {
throw new InsufficientFundsException("Not enough funds!");
}
// Business logic for fund transfer
}
}
Programmatic Rollback (প্রোগ্রাম্যাটিক রোলব্যাক):
এছাড়া, আপনি programmatic rollback প্রয়োগ করতে পারেন, যেখানে আপনি কোডের মাধ্যমে রোলব্যাক পরিচালনা করেন।
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.SessionContext;
@Stateless
public class AccountService {
@Resource
private SessionContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void transferFunds(int fromAccount, int toAccount, double amount) throws InsufficientFundsException {
if (amount > 1000) {
context.setRollbackOnly(); // Marks the transaction for rollback
throw new InsufficientFundsException("Not enough funds!");
}
// Business logic for fund transfer
}
}
Explanation:
context.setRollbackOnly(): যখন কোনো সমস্যা ঘটে এবং আপনি নিশ্চিত যে ট্রানজ্যাকশন রোলব্যাক করতে হবে, তখন এই মেথড ব্যবহার করা হয়। এটি সিস্টেমকে জানিয়ে দেয় যে, বর্তমান ট্রানজ্যাকশনটি রোলব্যাক করা উচিত।
Exception Handling and Rollback Mechanism Summary
| Feature | Declarative Security | Programmatic Security |
|---|---|---|
| Exception Handling | Exception mapping through ejb-jar.xml, automatic rollback for exceptions. | Exception handling through code (@Timeout, @Schedule), setRollbackOnly for explicit rollback. |
| Rollback Handling | @TransactionAttribute, automatic rollback for system exceptions or custom exceptions marked for rollback. | context.setRollbackOnly() for manual rollback in business logic. |
| Usage | Use when you want container-managed security (easier to configure). | Use when you need fine-grained control over transaction behavior. |
সারাংশ
EJB এর Exception Mapping এবং Rollback Handling ব্যবহার করার মাধ্যমে আপনি অ্যাপ্লিকেশনটির স্থিতিশীলতা এবং নির্ভরযোগ্যতা উন্নত করতে পারেন। Declarative Security এবং Programmatic Security দুটি পদ্ধতির মধ্যে ব্যবহৃত হলে আপনি সহজেই exception handling এবং rollback পরিচালনা করতে পারবেন। Exception mapping ও rollback handling ব্যবহারের মাধ্যমে, আপনি যদি কোনো ত্রুটি ঘটে তবে আপনার ডেটাবেস বা ট্রানজেকশন অপারেশনগুলো সঠিকভাবে পরিচালনা করতে পারবেন, যাতে সিস্টেমে কোনো অস্থিরতা না হয়।
Custom Exception Class তৈরি করা Java প্রোগ্রামিং ভাষায় একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, যা আপনাকে আপনার অ্যাপ্লিকেশনে বিশেষ ধরণের ত্রুটি (error) বা পরিস্থিতি সঠিকভাবে হ্যান্ডল করার সুযোগ দেয়। যখন Java এর ডিফল্ট এক্সসেপশনগুলি আপনার অ্যাপ্লিকেশনের প্রয়োজন পূরণ করতে সক্ষম হয় না, তখন custom exception তৈরি করে আপনি নির্দিষ্ট পরিস্থিতি বা ত্রুটি হ্যান্ডলিংয়ে বেশি নিয়ন্ত্রণ পেতে পারেন।
এখানে Eclipse IDE তে Custom Exception Class তৈরি এবং ব্যবস্থাপনা করার জন্য প্রক্রিয়াটি বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে।
১. Custom Exception Class তৈরি করা
Java তে Custom Exception Class তৈরি করতে, আপনাকে Exception অথবা RuntimeException ক্লাস এক্সটেন্ড করতে হয়। এটি করার জন্য দুটি পদ্ধতি রয়েছে:
- Checked Exception: এটি Exception ক্লাস এক্সটেন্ড করে তৈরি করা হয় এবং এর ক্ষেত্রে ট্রাই-ক্যাচ ব্লক বা মেথড সিগনেচারে
throwsডিক্লেয়ারেশন ব্যবহার করতে হয়। - Unchecked Exception: এটি RuntimeException ক্লাস এক্সটেন্ড করে তৈরি করা হয়, যা স্বয়ংক্রিয়ভাবে রানটাইম ত্রুটি হিসেবে গণ্য হয় এবং এটি এক্সপ্লিসিট ট্রাই-ক্যাচ ব্লক ছাড়া ব্যবহৃত হয়।
Checked Exception Example:
// Custom Exception Class (Checked Exception)
public class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message); // Passes the message to the parent class (Exception)
}
}
Unchecked Exception Example:
// Custom Exception Class (Unchecked Exception)
public class InvalidInputException extends RuntimeException {
public InvalidInputException(String message) {
super(message); // Passes the message to the parent class (RuntimeException)
}
}
এখানে:
InvalidAgeExceptionএকটি Checked Exception যেটি Exception ক্লাস এক্সটেন্ড করে।InvalidInputExceptionএকটি Unchecked Exception যেটি RuntimeException ক্লাস এক্সটেন্ড করে।
২. Custom Exception Class ব্যবহার করা
এখন যে custom exception ক্লাসটি তৈরি করেছি, সেটি ব্যবহার করা দেখানো হবে। এটি ব্যবহৃত হবে throw এবং throws কিওয়ার্ডের মাধ্যমে, যা ত্রুটি হ্যান্ডলিং এবং কাস্টম এক্সসেপশন ফেলে দেওয়ার প্রক্রিয়াকে সম্পন্ন করে।
Checked Exception Example (Method with throws):
public class AgeValidator {
public void validateAge(int age) throws InvalidAgeException {
if (age < 18) {
// Throw custom exception if age is less than 18
throw new InvalidAgeException("Age must be 18 or above!");
}
System.out.println("Age is valid");
}
public static void main(String[] args) {
AgeValidator validator = new AgeValidator();
try {
validator.validateAge(15); // This will throw InvalidAgeException
} catch (InvalidAgeException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
Unchecked Exception Example (Without throws):
public class InputValidator {
public void validateInput(String input) {
if (input == null || input.isEmpty()) {
// Throw custom unchecked exception if input is invalid
throw new InvalidInputException("Input cannot be null or empty!");
}
System.out.println("Valid input: " + input);
}
public static void main(String[] args) {
InputValidator validator = new InputValidator();
try {
validator.validateInput(""); // This will throw InvalidInputException
} catch (InvalidInputException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
ব্যাখ্যা:
- Checked Exception (InvalidAgeException):
- validateAge মেথডে throws InvalidAgeException ডিক্লেয়ারেশন ব্যবহার করা হয়েছে, কারণ
InvalidAgeExceptionএকটি checked exception। throw new InvalidAgeException("Age must be 18 or above!");এই লাইনে exception ফেলা হয়েছে।- মেথডটি try-catch ব্লকে রাখা হয়েছে যাতে exception ধরা যায় এবং যথাযথ মেসেজ প্রদর্শন করা যায়।
- validateAge মেথডে throws InvalidAgeException ডিক্লেয়ারেশন ব্যবহার করা হয়েছে, কারণ
- Unchecked Exception (InvalidInputException):
validateInputমেথডে RuntimeException-এর উপরে কাস্টম এক্সসেপশন তৈরি করা হয়েছে, যেটি Unchecked Exception।- throw new InvalidInputException("Input cannot be null or empty!"); লাইনে এক্সসেপশন ফেলা হয়েছে।
- যেহেতু এটি unchecked exception, তাই এটি throws ডিক্লেয়ারেশন ছাড়া ব্যবহার করা যায় এবং স্বয়ংক্রিয়ভাবে
try-catchব্লকের মাধ্যমে হ্যান্ডল করা হয়।
৩. Custom Exception Class এর অতিরিক্ত বৈশিষ্ট্য
একটি কাস্টম এক্সসেপশনের সাথে আরও কিছু অতিরিক্ত বৈশিষ্ট্য যোগ করা যেতে পারে, যেমন:
- Logging: Exception এর মধ্যে লগ মেসেজ সংযুক্ত করা।
- Error Codes: Exception এর সাথে কাস্টম error কোড পাঠানো।
- Stack Tracing: Exception এর মাধ্যমে আরও বিস্তারিত stack trace দেয়া।
Custom Exception with Error Code Example:
public class InvalidInputException extends RuntimeException {
private int errorCode;
public InvalidInputException(String message, int errorCode) {
super(message);
this.errorCode = errorCode;
}
public int getErrorCode() {
return errorCode;
}
}
public class InputValidator {
public void validateInput(String input) {
if (input == null || input.isEmpty()) {
// Throw custom unchecked exception with error code
throw new InvalidInputException("Input cannot be null or empty!", 1001);
}
System.out.println("Valid input: " + input);
}
public static void main(String[] args) {
InputValidator validator = new InputValidator();
try {
validator.validateInput(""); // This will throw InvalidInputException
} catch (InvalidInputException e) {
System.out.println("Caught exception: " + e.getMessage());
System.out.println("Error Code: " + e.getErrorCode());
}
}
}
এখানে, InvalidInputException এর মধ্যে একটি errorCode যুক্ত করা হয়েছে, যা RuntimeException থেকে উত্তরাধিকারী। এক্সসেপশন ফেলে দেয়ার সময় error কোড সহ মেসেজ প্রদান করা হয়েছে, এবং তারপর এটি getErrorCode() মেথডের মাধ্যমে অ্যাক্সেস করা হয়েছে।
৪. Custom Exception Class এর উপকারিতা
- Readability: কাস্টম এক্সসেপশন আপনাকে বিশেষ ত্রুটি সনাক্তকরণের জন্য সুনির্দিষ্ট মেসেজ এবং error কোড প্রদান করতে সাহায্য করে, যার ফলে কোড পড়তে সুবিধা হয়।
- Code Maintenance: আপনার অ্যাপ্লিকেশনে যেকোনো একটি নির্দিষ্ট ত্রুটি বা পরিস্থিতির জন্য কাস্টম এক্সসেপশন তৈরি করলে, কোড পরিচালনা সহজ হয় এবং ভবিষ্যতে নতুন ফিচার যোগ করার সময় ত্রুটি মোকাবেলা করা সহজ হয়।
- Error Handling: কাস্টম এক্সসেপশন তৈরি করে আপনি একটি নির্দিষ্ট ত্রুটি ব্যবস্থাপনার কৌশল তৈরি করতে পারেন এবং এটি আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ ও স্থিতিস্থাপক করে।
সারাংশ
Custom Exception Class তৈরি করা Java তে খুবই গুরুত্বপূর্ণ যখন আপনি ডিফল্ট এক্সসেপশনগুলির মাধ্যমে ত্রুটি মোকাবেলা করতে সক্ষম হন না এবং আপনার অ্যাপ্লিকেশনের জন্য নির্দিষ্ট ত্রুটি হ্যান্ডলিং করতে চান। Checked Exception এবং Unchecked Exception দুটি ধরনের কাস্টম এক্সসেপশন তৈরি করা যেতে পারে। আপনি throw এবং throws কিওয়ার্ড ব্যবহার করে কাস্টম এক্সসেপশন ফেলে দিতে পারেন এবং এর মাধ্যমে ত্রুটি হ্যান্ডলিং সুনির্দিষ্টভাবে পরিচালনা করতে পারেন।
Read more