কম্পিউটার টিউটোরিয়াল

C#-তে সিস্টেম লেভেল এবং অ্যাপ্লিকেশন লেভেল এক্সেপশনের পার্থক্য

দ্রুত তুলনা

বিষয়System Exception (System.SystemException)Application Exception (System.ApplicationException)
বেস ক্লাসSystem.SystemException → System.ExceptionSystem.ApplicationException → System.Exception
উত্পত্তি.NET CLR (রানটাইম) দ্বারা থ্রোঅ্যাপ্লিকেশন কোড দ্বারা থ্রো
প্রকৃতিনন-রিকভারেবল, ফ্যাটাল, ক্রিটিক্যালরিকভারেবল, বিজনেস লজিক রিলেটেড
উদাহরণOutOfMemoryException, StackOverflowException, NullReferenceException, IndexOutOfRangeException, InvalidOperationExceptionArgumentException, 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

  1. Catch specific exceptions first — সবচেয়ে ডেরাইভড টাইপ আগে
  2. Don't swallow exceptions — লগ করুন, রি-থ্রো করুন বা মেনিংফুল রেসপন্স দিন
  3. Use finally / using — রিসোর্স ক্লিনআপ নিশ্চিত করুন
  4. Don't use exceptions for control flow — শুধু এক্সসেপশনাল কেসের জন্য
  5. Custom exceptions — সিরিয়ালাইজেবল, সিরিয়ালাইজেশন কনস্ট্রাক্টর রাখুন

Exception Filter (C# 6+)


try {
    RiskyOperation();
} catch (IOException ex) when (ex.HResult == -2147024864) { // File not found
    // শুধু ফাইল না পাওয়া কেস হ্যান্ডেল
} catch (IOException ex) {
    // অন্যান্য IO এক্সেপশন
}
  1. Go এবং Java-এর পার্থক্য

  2. জাভাতে Exception এবং Error-এর পার্থক্য

  3. পাইথনে 'except Exception as e' এবং 'except Exception, e'-র পার্থক্য

  4. Windows 10-এ Recovery Drive বনাম System Image: কোন ব্যাকআপ অপশন সেরা?