এক্সেপশন চেইনিং হল একটি প্রক্রিয়া, যেখানে একটি এক্সেপশন (Exception) অন্য একটি এক্সেপশন দ্বারা ঘিরে বা "চেইন" হয়ে থাকে, অর্থাৎ এক্সেপশন হ্যান্ডলিং প্রক্রিয়াতে একাধিক এক্সেপশন একটি একে অপরকে অনুসরণ করে থাকে। এটি একটি ব্যবহারকারী-সংজ্ঞায়িত অবস্থানগত তথ্য (stack trace) বা কনটেক্সট ইনফরমেশন সহ একটি নতুন এক্সেপশন তৈরি করার জন্য ব্যবহৃত হয়, যা মূল এক্সেপশন (cause) এর কারণে ঘটেছে।
স্কালায় এক্সেপশন চেইনিং করা হয় মূল এক্সেপশন (cause) বা পূর্ববর্তী এক্সেপশনটিকে অন্তর্ভুক্ত করে, যাতে ডিবাগিং বা সমস্যা শনাক্তকরণ সহজ হয়।
১. এক্সেপশন চেইনিং কিভাবে কাজ করে?
একটি এক্সেপশনকে Throwable (যেমন, Exception, Error) হিসেবে চেইন করা হয়। যখন একটি নতুন এক্সেপশন তৈরি করা হয়, তখন আপনি পুরোনো এক্সেপশনটি cause হিসেবে প্রদান করতে পারেন।
স্কালায় এক্সেপশন চেইনিং করার জন্য আপনি throw কিওয়ার্ডের সাথে cause আর্গুমেন্ট ব্যবহার করতে পারেন। এটা পূর্ববর্তী এক্সেপশনটি নতুন এক্সেপশনের "কারণ" হিসেবে পাঠায়।
২. এক্সেপশন চেইনিং উদাহরণ
ধরা যাক, আমরা একটি ফাংশন লিখছি যা একটি নম্বরের ডিভাইডার হিসেবে কাজ করবে এবং তাতে কোনো এক্সেপশন ঘটলে সেই এক্সেপশন চেইন করা হবে।
object ExceptionChainingExample {
def divide(x: Int, y: Int): Int = {
if (y == 0) {
throw new ArithmeticException("Division by zero")
} else {
x / y
}
}
def calculate(x: Int, y: Int): Int = {
try {
divide(x, y)
} catch {
case e: ArithmeticException =>
throw new Exception("Failed to calculate division", e) // Chaining exception
}
}
def main(args: Array[String]): Unit = {
try {
calculate(10, 0)
} catch {
case e: Exception =>
println(s"Caught exception: ${e.getMessage}")
println(s"Caused by: ${e.getCause.getMessage}")
}
}
}এখানে:
divideফাংশন: দুইটি সংখ্যা দিয়ে ডিভিশন করার চেষ্টা করে, তবে যদিy == 0হয়, তাহলেArithmeticExceptionছুড়ে ফেলা হয়।calculateফাংশন:divideফাংশনটি কল করে এবং যদি কোনো এক্সেপশন ঘটে, তবে সেটিকে চেইন করে একটি নতুন এক্সেপশন (এটিExceptionটাইপ) তৈরি করা হয়।new Exception("Failed to calculate division", e): এখানেeহল পূর্ববর্তী এক্সেপশন (যেটিArithmeticException), যা নতুন এক্সেপশনের কারণে হিসেবে চেইন করা হয়।
আউটপুট:
Caught exception: Failed to calculate division
Caused by: Division by zeroএখানে:
- প্রথমে
ArithmeticExceptionঘটছে, এবং সেটি নতুনExceptionএর সাথে চেইন হয়ে যাচ্ছে। যখন সেই এক্সেপশনটি ক্যাচ করা হয়, তখন পূর্ববর্তী এক্সেপশনের তথ্য (যেমন, "Division by zero") পাওয়া যায়।
৩. এক্সেপশন চেইনিং এর সুবিধা
- ডিবাগিং সহজ করা:
এক্সেপশন চেইনিংয়ের মাধ্যমে আপনি পূর্ববর্তী এক্সেপশনের তথ্য এবং কারণ সম্পর্কে বিশদভাবে জানতে পারবেন, যা সমস্যার উৎস চিহ্নিত করতে সহায়তা করে। - কারণ ট্র্যাকিং:
এক্সেপশন চেইনিং মূল এক্সেপশন বা কারণকে ধরে রেখে, আপনি কিভাবে এক্সেপশনটি ঘটেছে তা জানতে পারবেন। উদাহরণস্বরূপ, যদি কোনো ফাইল খুলতে গিয়ে সমস্যা হয়, তবে আপনি দেখতে পাবেন কি কারণে ফাইল খোলা সম্ভব হয়নি (যেমন, ফাইল পাওয়া যায়নি বা অনুমতি নেই)। - প্রোফেশনাল এবং পরিষ্কার কোড:
এক্সেপশন চেইনিং কোডকে আরও পরিষ্কার এবং প্রোফেশনাল করে তোলে, কারণ এতে মূল এক্সেপশনের বিষয়বস্তু সংরক্ষিত থাকে এবং একটি নতুন এক্সেপশন তার কারণ হিসেবে কাজ করে।
৪. এক্সেপশন চেইনিংয়ের সঠিক ব্যবহার
স্কালায় এক্সেপশন চেইনিং করার সময় কিছু মূল বিষয় মনে রাখা গুরুত্বপূর্ণ:
getCauseব্যবহার করা:
যখন আপনি নতুন এক্সেপশন তৈরি করেন এবং পূর্ববর্তী এক্সেপশন চেইন করেন, তখনgetCauseমেথড ব্যবহার করে আপনি মূল এক্সেপশনের তথ্য পেতে পারেন।উদাহরণ:
val ex = new Exception("New exception", new ArithmeticException("Previous exception")) println(ex.getCause.getMessage) // Output: Previous exceptionThrowableএবংExceptionকাস্টমাইজেশন:
যদি আপনি কাস্টম এক্সেপশন তৈরি করতে চান, তবেThrowableবাExceptionক্লাসের জন্য কাস্টম কন্সট্রাক্টর তৈরি করতে পারেন যা পূর্ববর্তী এক্সেপশনটিকেcauseহিসেবে গ্রহণ করবে।উদাহরণ:
class CustomException(message: String, cause: Throwable) extends Exception(message, cause) throw new CustomException("Something went wrong", new ArithmeticException("Division by zero"))
সারাংশ
- এক্সেপশন চেইনিং স্কালায় এমন একটি প্রক্রিয়া যেখানে একটি এক্সেপশন আরেকটি এক্সেপশনের কারণে ঘটে এবং এই এক্সেপশন দুটি একে অপরের সাথে যুক্ত থাকে।
- স্কালায় এক্সেপশন চেইনিং করতে, আপনি
ExceptionঅথবাThrowableকন্সট্রাক্টর ব্যবহার করে পূর্ববর্তী এক্সেপশনকেcauseহিসেবে পাঠাতে পারেন। - এক্সেপশন চেইনিংয়ের মাধ্যমে ডিবাগিং এবং এrror ট্র্যাকিং আরও সহজ হয়।
এটি একটি শক্তিশালী কৌশল, যা স্কালায় এক্সেপশন হ্যান্ডলিংকে আরও নমনীয় এবং কার্যকরী করে তোলে।