দ্রুত তুলনা
| বিষয় | System Exception (System.SystemException) | Application Exception (System.ApplicationException) |
|---|---|---|
| বেস ক্লাস | System.SystemException → System.Exception | System.ApplicationException → System.Exception |
| উত্পত্তি | .NET CLR (রানটাইম) দ্বারা থ্রো | অ্যাপ্লিকেশন কোড দ্বারা থ্রো |
| প্রকৃতি | নন-রিকভারেবল, ফ্যাটাল, ক্রিটিক্যাল | রিকভারেবল, বিজনেস লজিক রিলেটেড |
| উদাহরণ | OutOfMemoryException, StackOverflowException, NullReferenceException, IndexOutOfRangeException, InvalidOperationException | ArgumentException, InvalidOperationException (কাস্টম), BusinessRuleViolationException |
| হ্যান্ডলিং | সাধারণত ক্যাচ করা উচিত নয় (লগ করে ক্র্যাশ দিন) | Try-catch দিয়ে হ্যান্ডল করুন, ইউজার ফ্রেন্ডলি মেসেজ দিন |
| কাস্টম এক্সেপশন | নয় (CLR-রিজার্ভড) | হ্যাঁ, ApplicationException থেকে ইনহেরিট করে বানান |
সিস্টেম এক্সেপশন (CLR-থ্রোvn)
এগুলো প্রোগ্রামার কন্ট্রোলের বাইরে, সিস্টেম-লেভেল রিসোর্স ফেইলার নির্দেশ করে।
// উদাহরণ: এইগুলো আপনি থ্রো করবেন না
throw new OutOfMemoryException(); // মেমরি শেষ
throw new StackOverflowException(); // স্ট্যাক ওভারফ্লো (ক্যাচ করা যায় না!)
throw new NullReferenceException(); // প্রোগ্রামিং বাগ
throw new IndexOutOfRangeException(); // অ্যারে বাউন্ড চেক
throw new InvalidOperationException(); // অবৈধ স্টেট (কনটেক্সট-নির্ভর)
অ্যাপ্লিকেশন এক্সেপশন (বিজনেস লজিক)
বিকাশকারী দ্বারা ডিফাইন করা, রিকভারেবল এরর কনভেয় করার জন্য।
কাস্টম অ্যাপ্লিকেশন এক্সেপশন বানানো
using System;
// বেস কাস্টম এক্সেপশন
public abstract class AppException : ApplicationException {
public string ErrorCode { get; }
public AppException(string message, string errorCode) : base(message) {
ErrorCode = errorCode;
}
}
// স্পেসিফিক এক্সেপশনস
public class ValidationException : AppException {
public ValidationException(string message) : base(message, "VAL_001") { }
}
public class InsufficientFundsException : AppException {
public decimal CurrentBalance { get; }
public decimal RequestedAmount { get; }
public InsufficientFundsException(decimal balance, decimal requested)
: base($"Insufficient funds: {balance} < {requested}", "BIZ_002") {
CurrentBalance = balance;
RequestedAmount = requested;
}
}
public class UserNotFoundException : AppException {
public UserNotFoundException(string userId)
: base($"User not found: {userId}", "USR_404") { }
}
ব্যবহার
public class AccountService {
public void Withdraw(string userId, decimal amount) {
var user = _repo.GetUser(userId);
if (user == null)
throw new UserNotFoundException(userId);
if (user.Balance < amount)
throw new InsufficientFundsException(user.Balance, amount);
user.Balance -= amount;
_repo.Save(user);
}
}
// কলার সাইড
try {
accountService.Withdraw("user123", 500);
} catch (UserNotFoundException ex) {
// লগ, ইউজারকে দেখান
logger.Warn(ex.Message);
ShowError("User not found");
} catch (InsufficientFundsException ex) {
logger.Info(ex.Message);
ShowError($"Balance: {ex.CurrentBalance}, Need: {ex.RequestedAmount}");
} catch (AppException ex) {
// অন্যান্য অ্যাপ এক্সেপশন
logger.Error(ex, ex.ErrorCode);
ShowError("Operation failed");
} catch (Exception ex) {
// সিস্টেম এক্সেপশন / অনপ্রেডিক্টেড
logger.Critical(ex, "Unexpected system error");
ShowError("System error, please try later");
}
সতর্কতা: ApplicationException বেস ক্লাসとして সবসময় ভালো নয়
Microsoft এখন ApplicationException থেকে ইনহেরিট করার পরিবর্তে সরাসরি Exception থেকে ইনহেরিট করার সুপারিশ করে, কারণ:
ApplicationExceptionকোনো অতিরিক্ত ভ্যালু দেয় না- এটি কনফিউশন সৃষ্টি করে (সব কাস্টম এক্সেপশন "অ্যাপ্লিকেশন" লেভেল নয়)
- সেরা প্র্যাকটিস:
class MyException : Exception
Exception Handling Best Practices
- Catch specific exceptions first — সবচেয়ে ডেরাইভড টাইপ আগে
- Don't swallow exceptions — লগ করুন, রি-থ্রো করুন বা মেনিংফুল রেসপন্স দিন
- Use finally / using — রিসোর্স ক্লিনআপ নিশ্চিত করুন
- Don't use exceptions for control flow — শুধু এক্সসেপশনাল কেসের জন্য
- Custom exceptions — সিরিয়ালাইজেবল, সিরিয়ালাইজেশন কনস্ট্রাক্টর রাখুন
Exception Filter (C# 6+)
try {
RiskyOperation();
} catch (IOException ex) when (ex.HResult == -2147024864) { // File not found
// শুধু ফাইল না পাওয়া কেস হ্যান্ডেল
} catch (IOException ex) {
// অন্যান্য IO এক্সেপশন
}