20. జావా ఎక్సెప్షన్ హ్యాండ్లింగ్ & Custom Exceptions (Robust Error Handling Mastery)

☕ Java (Java 21+ LTS) 🟢 Lesson 20 of 25 📂 Part 04: Core OOP & Exceptions (Page 5 of 5) ⏱️ 26 min read
📌 Covered in this lesson: Throwable, Error, Exception హైరార్కీ · Checked vs Unchecked Exceptions · try-catch-finally & Multi-catch · try-with-resources · కస్టమ్ బిజినెస్ ఎక్సెప్షన్ల సృష్టి

నిజ ప్రపంచంలో నడిచే ఎంటర్‌ప్రైజ్ సాఫ్ట్‌వేర్ అప్లికేషన్లు ఎల్లప్పుడూ ఆదర్శవంతమైన పరిస్థితులలో పనిచేయవు. నెట్‌వర్క్ డిస్‌కనెక్ట్ కావచ్చు, డేటాబేస్ సర్వర్ డౌన్ కావచ్చు, లేదా యూజర్ తప్పుడు పాస్‌వర్డ్ ఇవ్వవచ్చు. ఇటువంటి అనూహ్య వైఫల్యాలు (Runtime Abnormalities) సంభవించినప్పుడు అప్లికేషన్ అకస్మాత్తుగా కుప్పకూలిపోకుండా, పరిస్థితిని సునాయాసంగా ఎదుర్కొని సాధారణ ప్రవాహాన్ని కొనసాగించేందుకు జావా అందించిన అత్యంత శక్తివంతమైన రక్షణ వ్యవస్థ ఎక్సెప్షన్ హ్యాండ్లింగ్ (Exception Handling). జావాలో Throwable హైరార్కీ ఎలా ఉంటుంది? నివారించలేని Error మరియు పరిష్కరించగల Exception మధ్య తేడా ఏమిటి? కంపైలర్ ఖచ్చితంగా తనిఖీ చేసే Checked Exceptions మరియు లాజిక్ బగ్స్ వల్ల వచ్చే Unchecked Exceptions మధ్య వ్యత్యాసం ఏమిటి? ఆధునిక జావా 7+ లో వచ్చిన try-with-resources మెమరీ లీక్‌లను ఎలా సమూలంగా అరికడుతుంది? మరియు పరిశ్రమ ప్రమాణాలకు అనుగుణంగా కస్టమ్ బిజినెస్ ఎక్సెప్షన్లను (Custom Business Exceptions) ఎలా రూపొందించాలి? అనే సంపూర్ణ ప్రాక్టికల్ విశ్లేషణను ఈ పాఠంలో నేర్చుకుందాం.

ఫైర్ అలారమ్ & సర్క్యూట్ బ్రేకర్ ఫ్యూజ్ అనాలజీ (The Fire Alarm & Circuit Breaker Analogy):

  1. 1. Error vs Exception (తీవ్రమైన భూకంపం vs కిచెన్‌లో చిన్న మంట):
    • Error (java.lang.Error): భవనం పునాదులతో సహా కూలిపోయే భారీ భూకంపం వంటిది (ఉదా: OutOfMemoryError, StackOverflowError). దీనిని కోడ్ ద్వారా ఎవరూ ఆపలేరు; JVM పూర్తిగా నిలిచిపోతుంది.
    • Exception (java.lang.Exception): కిచెన్‌లో గ్యాస్ స్టవ్ వద్ద చిన్న మంట రావడం. వెంటనే ఫైర్ ఎస్టింగిషర్ (try-catch) ఉపయోగించి మంటను ఆర్పేసి, మిగిలిన ఇంటి పనులను సజావుగా కొనసాగించవచ్చు.
  2. 2. Checked vs Unchecked Exceptions (ఎయిర్‌పోర్ట్ సెక్యూరిటీ గేట్ vs నడిచేటప్పుడు ముల్లు గుచ్చుకోవడం):
    • Checked Exception: అంతర్జాతీయ విమానం ఎక్కేముందు పాస్‌పోర్ట్, వీసా కచ్చితంగా ఉన్నాయో లేదో సెక్యూరిటీ ఆఫీసర్ ముందే తనిఖీ చేస్తాడు. కంపైల్ సమయంలోనే జావా కంపైలర్ 'దీనికి try-catch రాశావా?' అని గట్టిగా అడుగుతుంది (ఉదా: FileNotFoundException, SQLException).
    • Unchecked Exception (RuntimeException): రోడ్డుపై నడుస్తూ కాలు జారి కింద పడటం లేదా కాలికి రాయి తగలడం (ఉదా: NullPointerException, ArithmeticException). ఇది ముందే ఊహించలేము; ప్రోగ్రామర్ సరైన జాగ్రత్తలు తీసుకోకపోవడం వల్ల వచ్చే లాజిక్ లోపాలు.
  3. 3. try-with-resources (స్మార్ట్ సెన్సార్ డోర్లు - AutoCloseable Doors): ఒక రహస్య గదిలోకి వెళ్లి పని ముగిసిన తర్వాత తలుపులు మూయడం, ఏసీ ఆఫ్ చేయడం మనుషులు మర్చిపోవచ్చు (పాతకాలపు finally లో క్లోజ్ చేయడం మర్చిపోతే మెమరీ లీక్). కానీ ఆధునిక జావా 7+ try (resource) అనేది స్మార్ట్ సెన్సార్ డోర్ లాంటిది; పని పూర్తయినా లేదా మధ్యలో ఎక్సెప్షన్ వచ్చినా సరే, రిసోర్స్‌ను ఆటోమేటిక్‌గా క్షణంలో క్లోజ్ చేసి మెమరీ లీక్‌ను నివారిస్తుంది!

ఈ పాఠం ముగిసేసరికి మీరు Part 04 (Core OOP & Exceptions) ను 100% విజయవంతంగా ముగించి, ఎంటర్‌ప్రైజ్ స్థాయి రెసిలియంట్ పేమెంట్ గేట్‌వే ట్రాన్సాక్షన్ ఇంజిన్‌ను తయారు చేయగల పరిపూర్ణ స్థాయికి చేరుకుంటారు!

1. ఎక్సెప్షన్ హ్యాండ్లింగ్ అంటే ఏమిటి? (Robust Error Resilience)

ఒక ప్రోగ్రామ్ నడుస్తున్నప్పుడు దాని సాధారణ ఆదేశాల ప్రవాహాన్ని (Normal Flow of Instructions) అడ్డుకునే అవాంఛనీయ సంఘటనను ఎక్సెప్షన్ (Exception) అంటారు.

ఎక్సెప్షన్ హ్యాండ్లింగ్ లేకపోతే, లోపం సంభవించిన వెంటనే ప్రోగ్రామ్ అకస్మాత్తుగా ఆగిపోయి (Crash), స్క్రీన్ పై ఎర్రటి ఎర్రర్ లాగ్‌లను విసిరి యూజర్‌ను అయోమయానికి గురిచేస్తుంది. ఎక్సెప్షన్ హ్యాండ్లింగ్ ద్వారా మనం ఆ లోపాన్ని సున్నితంగా క్యాచ్ చేసి, ప్రత్యామ్నాయ మార్గాన్ని (Fallback path) అమలు చేసి, యూజర్‌కు అర్థమయ్యే సందేశాన్ని అందిస్తాం.

2. Throwable హైరార్కీ: Error vs Exception (The Java Exception Tree)

జావాలో ఎక్సెప్షన్ వ్యవస్థ మొత్తం ఒక క్రమబద్ధమైన క్లాస్ హైరార్కీని కలిగి ఉంటుంది:

java.lang.Object
  └── java.lang.Throwable (రూట్ క్లాస్)
       ├── java.lang.Error (JVM వైఫల్యాలు - కోడ్ ద్వారా రికవరీ సాధ్యం కాదు)
       │    ├── OutOfMemoryError
       │    └── StackOverflowError
       └── java.lang.Exception (అప్లికేషన్ లోపాలు - try-catch తో రికవరీ చేయవచ్చు)
            ├── Checked Exceptions (IOException, SQLException etc.)
            └── RuntimeException (Unchecked) (NullPointer, Arithmetic etc.)

3. Checked vs Unchecked RuntimeExceptions (The Crucial Difference)

జావాలోని ఎక్సెప్షన్లలో అత్యంత ముఖ్యమైన వర్గీకరణ:

లక్షణం Checked Exceptions Unchecked Exceptions (Runtime)
పేరెంట్ క్లాస్ నేరుగా java.lang.Exception సబ్‌క్లాసెస్ java.lang.RuntimeException సబ్‌క్లాసెస్
కంపైలర్ తనిఖీ కంపైల్ సమయంలోనే తప్పనిసరిగా తనిఖీ చేస్తుంది కంపైలర్ తనిఖీ చేయదు (రన్‌టైమ్‌లో వస్తాయి)
హ్యాండ్లింగ్ నిబంధన తప్పనిసరిగా try-catch లేదా throws రాయాలి హ్యాండ్లింగ్ ఐచ్ఛికం (కోడ్ లోపాలను సరిదిద్దాలి)
ఉదాహరణలు IOException, SQLException, ClassNotFoundException NullPointerException, ArithmeticException, IndexOutOfBounds

4. Call Stack Unwinding & StackTrace (How Exceptions Travel Upwards)

ఒక మెథడ్ లోపల ఎక్సెప్షన్ సంభవించినప్పుడు, దానికి try-catch లేకపోతే ఏమి జరుగుతుంది?

JVM ఆ మెథడ్ ఎగ్జిక్యూషన్‌ను అక్కడికక్కడే ఆపివేసి, కాల్ స్టాక్ లోని మునుపటి మెథడ్ (Caller Method) వద్దకు ఎక్సెప్షన్ ఆబ్జెక్ట్‌ను విసిరివేస్తుంది. అక్కడ కూడా హ్యాండ్లర్ లేకపోతే, దాని మునుపటి మెథడ్‌కు వెళ్తుంది — ఇలా main() మెథడ్ దాటి చివరకు JVM డీఫాల్ట్ ఎక్సెప్షన్ హ్యాండ్లర్ వద్దకు చేరి ప్రోగ్రామ్‌ను క్రాష్ చేస్తుంది. దీనినే కాల్ స్టాక్ అన్‌వైండింగ్ (Call Stack Unwinding / Exception Propagation) అంటారు.

5. try-catch-finally & Multi-catch (Structured Exception Handling)

జావాలో ఎక్సెప్షన్లను హ్యాండిల్ చేయడానికి ప్రాథమిక నిర్మాణం:

try {
    // ప్రమాదం ఉన్న కోడ్ (Risky operations)
} catch (IOException | SQLException e) { // Java 7 Multi-Catch
    // లోపాన్ని లాగ్ చేయడం & ప్రత్యామ్నాయం
} finally {
    // ఎక్సెప్షన్ వచ్చినా రాకపోయినా ఖచ్చితంగా ఎగ్జిక్యూట్ అయ్యే క్లీనప్ బ్లాక్!
}
⚠️ finally బ్లాక్ ఎప్పుడు రన్ కాదు? ప్రోగ్రామ్ మధ్యలో System.exit(0); పిలిచినప్పుడు లేదా పవర్ కట్ / OS క్రాష్ అయినప్పుడు మాత్రమే finally బ్లాక్ రన్ అవ్వదు; మిగిలిన అన్ని సందర్భాలలో (చివరకు try లో return; ఉన్నా సరే) finally ఖచ్చితంగా ఎగ్జిక్యూట్ అవుతుంది!

6. Java 7+ try-with-resources & AutoCloseable (Zero Leak Resource Management)

డేటాబేస్ కనెక్షన్‌లు, ఫైల్ హ్యాండిల్స్, లేదా నెట్‌వర్క్ సాకెట్లను వాడిన తర్వాత వాటిని close() చేయడం డెవలపర్లు తరచూ మర్చిపోతారు.

దీనికి పరిష్కారంగా Java 7 లో వచ్చిన try-with-resources స్టేట్‌మెంట్ ఒక అద్భుతం. java.lang.AutoCloseable ఇంటర్‌ఫేస్‌ను ఇంప్లిమెంట్ చేసే ఏదైనా రిసోర్స్‌ను try(...) బ్రాకెట్లలో డిక్లేర్ చేస్తే చాలు — బ్లాక్ ముగియగానే JVM స్వయంగా దాని close() మెథడ్‌ను పిలుస్తుంది!

try (FileReader fr = new FileReader("app.log");
     BufferedReader br = new BufferedReader(fr)) {
    System.out.println(br.readLine());
} // ఇక్కడ finally బ్లాక్ లేకుండానే br మరియు fr ఆటోమేటిక్‌గా క్లోజ్ అయిపోతాయి!

7. throw vs throws కీవర్డ్స్ & ప్రాపగేషన్ (Triggering vs Declaring)

ఈ రెండు కీవర్డ్స్ మధ్య స్పష్టమైన తేడా ఉంది:

  • throw (క్రియ - Action): కోడ్ లోపల స్వయంగా ఒక ఎక్సెప్షన్ ఆబ్జెక్ట్‌ను సృష్టించి విసరడానికి వాడతాం: throw new IllegalArgumentException("చెల్లని విలువ");.
  • throws (ప్రకటన - Declaration): మెథడ్ సిగ్నేచర్ వద్ద వాడతాం. ఈ మెథడ్ రన్ అయ్యేటప్పుడు ఫలానా చెక్‌డ్ ఎక్సెప్షన్లు వచ్చే అవకాశం ఉందని కాలర్లకు హెచ్చరిస్తుంది: public void readFile() throws IOException { ... }.

8. Custom Business Exceptions సృష్టి (Domain-Specific Exceptions)

నిజ జీవిత ప్రాజెక్ట్‌లలో సాధారణ Exception లేదా RuntimeException విసరడం మంచి పద్ధతి కాదు. వ్యాపార డొమైన్‌కు సరిపోయే అర్థవంతమైన కస్టమ్ ఎక్సెప్షన్లను సృష్టించాలి:

// కస్టమ్ బిజినెస్ అన్‌చెక్‌డ్ ఎక్సెప్షన్
public class InsufficientBalanceException extends RuntimeException {
    private final double shortfallAmount;

    public InsufficientBalanceException(String message, double shortfall) {
        super(message);
        this.shortfallAmount = shortfall;
    }
    public double getShortfallAmount() { return shortfallAmount; }
}

9. డెమో 1: Checked vs Unchecked & Multi-catch డెమో (Exception Flow Demo)

చెక్‌డ్ ఎక్సెప్షన్లు మరియు అన్‌చెక్‌డ్ ఎక్సెప్షన్లను ఒకే పైప్‌లైన్‌లో మల్టీ-క్యాచ్ బ్లాక్ ద్వారా ఎలా సమర్థవంతంగా హ్యాండిల్ చేయాలో పరిశీలిద్దాం:

CheckedVsUncheckedExceptionDemo.java
public class CheckedVsUncheckedExceptionDemo {

    // Simulating a calculation that might fail with Unchecked ArithmeticException
    public static int divide(int a, int b) {
        return a / b;
    }

    // Simulating a method that throws Checked Exception
    public static void validateAgeForLicense(int age) throws Exception {
        if (age < 18) {
            throw new Exception("Age " + age + " is below legal driving limit of 18!");
        }
    }

    public static void main(String[] args) {
        System.out.println("=================================================");
        System.out.println("⚡ CHECKED VS UNCHECKED EXCEPTION MULTI-CATCH DEMO");
        System.out.println("=================================================
");

        // Test Case 1: Unchecked Arithmetic Exception
        try {
            System.out.println("1. Attempting division 100 / 0...");
            int result = divide(100, 0);
            System.out.println("   Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("   🛡️ CAUGHT UNCHECKED: Division by zero caught! " + e.getMessage());
        }

        // Test Case 2: Checked Exception with Validation
        System.out.println("
2. Attempting Checked Age Validation (16 yrs)...");
        try {
            validateAgeForLicense(16);
        } catch (Exception e) {
            System.out.println("   🛡️ CAUGHT CHECKED: " + e.getMessage());
        } finally {
            System.out.println("   🔒 Finally Block: Security audit check log written.");
        }

        System.out.println("
=================================================");
        System.out.println("✅ Application survived all exceptions without crashing!");
        System.out.println("=================================================");
    }
}
Terminal Output:
=================================================
⚡ CHECKED VS UNCHECKED EXCEPTION MULTI-CATCH DEMO
=================================================

1. Attempting division 100 / 0...
   🛡️ CAUGHT UNCHECKED: Division by zero caught! / by zero

2. Attempting Checked Age Validation (16 yrs)...
   🛡️ CAUGHT CHECKED: Age 16 is below legal driving limit of 18!
   🔒 Finally Block: Security audit check log written.

=================================================
✅ Application survived all exceptions without crashing!
=================================================

10. డెమో 2: try-with-resources & AutoCloseable (Resource Closure Life Cycle)

AutoCloseable ఇంటర్‌ఫేస్‌ను ఇంప్లిమెంట్ చేసే కస్టమ్ క్లౌడ్ డేటాబేస్ సాకెట్ రిసోర్స్ ఎక్సెప్షన్ వచ్చినప్పుడు కూడా ఎలా ఆటోమేటిక్‌గా క్లోజ్ అవుతుందో పరిశీలిద్దాం:

TryWithResourcesAutoCloseableDemo.java
public class TryWithResourcesAutoCloseableDemo {

    // Custom Cloud DB Socket implementing AutoCloseable
    public static class CloudDatabaseSocket implements AutoCloseable {
        private final String connectionUrl;

        public CloudDatabaseSocket(String url) {
            this.connectionUrl = url;
            System.out.println("  🔌 [Socket Opened] Connected to " + connectionUrl);
        }

        public void executeQuery(String sql) {
            System.out.println("  📊 [Executing Query] " + sql);
            if (sql.contains("FAIL")) {
                throw new IllegalStateException("Database query hardware timeout occurred!");
            }
        }

        @Override
        public void close() {
            System.out.println("  🛑 [Socket Closed] Safely released connection to " + connectionUrl);
        }
    }

    public static void main(String[] args) {
        System.out.println("=================================================");
        System.out.println("🔄 TRY-WITH-RESOURCES AUTOCLOSEABLE LIFECYCLE");
        System.out.println("=================================================
");

        System.out.println("1. NORMAL EXECUTION (Auto-close after success):");
        try (CloudDatabaseSocket db = new CloudDatabaseSocket("jdbc:aurora://primary-cluster:5432")) {
            db.executeQuery("SELECT * FROM customer_accounts LIMIT 10;");
        } catch (Exception e) {
            System.out.println("   Error: " + e.getMessage());
        }

        System.out.println("
2. EXCEPTION EXECUTION (Auto-close STILL GUARANTEED):");
        try (CloudDatabaseSocket db = new CloudDatabaseSocket("jdbc:aurora://failover-cluster:5432")) {
            db.executeQuery("SELECT * FROM FAIL_TRIGGER_TABLE;");
        } catch (Exception e) {
            System.out.println("   🛡️ CAUGHT EXCEPTION: " + e.getMessage());
        }

        System.out.println("
=================================================");
        System.out.println("✅ Zero Memory / Socket leaks achieved via AutoCloseable!");
        System.out.println("=================================================");
    }
}
Terminal Output:
=================================================
🔄 TRY-WITH-RESOURCES AUTOCLOSEABLE LIFECYCLE
=================================================

1. NORMAL EXECUTION (Auto-close after success):
  🔌 [Socket Opened] Connected to jdbc:aurora://primary-cluster:5432
  📊 [Executing Query] SELECT * FROM customer_accounts LIMIT 10;
  🛑 [Socket Closed] Safely released connection to jdbc:aurora://primary-cluster:5432

2. EXCEPTION EXECUTION (Auto-close STILL GUARANTEED):
  🔌 [Socket Opened] Connected to jdbc:aurora://failover-cluster:5432
  📊 [Executing Query] SELECT * FROM FAIL_TRIGGER_TABLE;
  🛑 [Socket Closed] Safely released connection to jdbc:aurora://failover-cluster:5432
   🛡️ CAUGHT EXCEPTION: Database query hardware timeout occurred!

=================================================
✅ Zero Memory / Socket leaks achieved via AutoCloseable!
=================================================

11. Capstone ప్రాజెక్ట్: ఎంటర్‌ప్రైజ్ రెసిలియంట్ పేమెంట్ గేట్‌వే ట్రాన్సాక్షన్ ఇంజిన్

ఈ అధ్యాయంలో మరియు Part 04 అంతటా నేర్చుకున్న అన్ని కాన్సెప్టులను (కస్టమ్ ఎక్సెప్షన్స్, Checked vs Unchecked, try-with-resources, రోల్‌బ్యాక్ ఆర్కిటెక్చర్ మరియు ఆడిట్ లాగింగ్) సమగ్రంగా మిళితం చేస్తూ ఒక ప్రొడక్షన్-గ్రేడ్ Resilient Payment Gateway Transaction & Rollback Engine ను నిర్మిద్దాం:

ResilientPaymentGatewayTransactionEngine.java
public class ResilientPaymentGatewayTransactionEngine {

    // Domain Custom Exception 1: Insufficient Balance
    public static class InsufficientFundsException extends Exception {
        private final double shortfall;
        public InsufficientFundsException(double available, double required) {
            super(String.format("Insufficient balance: Available ₹%,.2f, Required ₹%,.2f", available, required));
            this.shortfall = required - available;
        }
        public double getShortfall() { return shortfall; }
    }

    // Domain Custom Exception 2: Fraud Alert (Unchecked Runtime)
    public static class FraudDetectedException extends RuntimeException {
        public FraudDetectedException(String message) {
            super(message);
        }
    }

    // Account Service with Transaction Simulation
    public static class BankPaymentProcessor {
        private double accountBalance = 50000.0;

        public void executeTransfer(String targetVpa, double amount) throws InsufficientFundsException {
            System.out.printf("💸 Initiating Transfer of ₹%,.2f to [%s]...%n", amount, targetVpa);

            // Fraud Check
            if (targetVpa.contains("blacklisted_hacker")) {
                throw new FraudDetectedException("🚨 Transaction blocked by AI Anti-Fraud Radar for recipient: " + targetVpa);
            }

            // Balance Check
            if (amount > accountBalance) {
                throw new InsufficientFundsException(accountBalance, amount);
            }

            // Deduct
            accountBalance -= amount;
            System.out.printf("✅ Transfer Successful! Remaining Account Balance: ₹%,.2f%n", accountBalance);
        }
    }

    public static void main(String[] args) {
        System.out.println("=================================================");
        System.out.println("💳 RESILIENT FINTECH TRANSACTION & ROLLBACK ENGINE");
        System.out.println("=================================================
");

        BankPaymentProcessor processor = new BankPaymentProcessor();

        // Transaction 1: Successful Transfer
        try {
            processor.executeTransfer("balaji@okhdfc", 15000.0);
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }

        // Transaction 2: Insufficient Funds (Checked Exception Handled)
        System.out.println("
-------------------------------------------------");
        try {
            processor.executeTransfer("vendor@icici", 45000.0); // Only 35000 left
        } catch (InsufficientFundsException e) {
            System.out.println("❌ PAYMENT REJECTED: " + e.getMessage());
            System.out.printf("   💡 Suggested Action: Please add ₹%,.2f to complete payment.%n", e.getShortfall());
        }

        // Transaction 3: Fraud Radar Block (Unchecked Exception Handled)
        System.out.println("
-------------------------------------------------");
        try {
            processor.executeTransfer("blacklisted_hacker@fraud", 500.0);
        } catch (FraudDetectedException e) {
            System.out.println("🛑 SECURITY LOCKDOWN: " + e.getMessage());
            System.out.println("   🔒 Compliance Alert: Event dispatched to Cyber Cell Incident Desk.");
        } catch (InsufficientFundsException e) {
            System.out.println("Error: " + e.getMessage());
        }

        System.out.println("
=================================================");
        System.out.println("🎉 PART 04 (CORE OOP & EXCEPTIONS) COMPLETED 100%!");
        System.out.println("=================================================");
    }
}
Terminal Output:
=================================================
💳 RESILIENT FINTECH TRANSACTION & ROLLBACK ENGINE
=================================================

💸 Initiating Transfer of ₹15,000.00 to [balaji@okhdfc]...
✅ Transfer Successful! Remaining Account Balance: ₹35,000.00

-------------------------------------------------
💸 Initiating Transfer of ₹45,000.00 to [vendor@icici]...
❌ PAYMENT REJECTED: Insufficient balance: Available ₹35,000.00, Required ₹45,000.00
   💡 Suggested Action: Please add ₹10,000.00 to complete payment.

-------------------------------------------------
💸 Initiating Transfer of ₹500.00 to [blacklisted_hacker@fraud]...
🛑 SECURITY LOCKDOWN: 🚨 Transaction blocked by AI Anti-Fraud Radar for recipient: blacklisted_hacker@fraud
   🔒 Compliance Alert: Event dispatched to Cyber Cell Incident Desk.

=================================================
🎉 PART 04 (CORE OOP & EXCEPTIONS) COMPLETED 100%!
=================================================

12. ప్రొడక్షన్ పిట్‌ఫాల్స్, బెస్ట్ ప్రాక్టీసెస్ & 5 క్విజ్‌లు (Best Practices & Quizzes)

🚫 ప్రొడక్షన్‌లో నివారించాల్సిన 4 ఘోరమైన తప్పులు (Production Pitfalls):

  1. ఖాళీ క్యాచ్ బ్లాకులు రాయడం (Catch & Swallow Antipattern): catch (Exception e) {} అని ఏమీ చేయకుండా వదిలేస్తే సమస్య ఎక్కడ వచ్చిందో ఎప్పటికీ తెలియక డీబగ్గింగ్ నరకంగా మారుతుంది. ఎల్లప్పుడూ లాగ్ చేయాలి.
  2. ఫ్లో కంట్రోల్ కోసం ఎక్సెప్షన్స్ వాడటం: లూప్ బౌండరీలను ఆపడానికి ఎక్సెప్షన్లు వాడకూడదు; స్టాక్ ట్రేస్ క్రియేషన్ అనేది CPU కి చాలా ఖరీదైన ఆపరేషన్.
  3. సరిగ్గా క్లోజ్ చేయకపోవడం: పాతకాలపు మాన్యువల్ క్లోజ్ లకు బదులుగా ఎల్లప్పుడూ try-with-resources వాడాలి.
  4. సాధారణ Throwable ని క్యాచ్ చేయడం: catch (Throwable t) అని రాస్తే OutOfMemoryError లాంటి ప్రాణాంతకమైన JVM ఎర్రర్లు కూడా క్యాచ్ అయి సిస్టమ్ కరప్ట్ అవుతుంది. కేవలం Exception ను మాత్రమే క్యాచ్ చేయాలి.

✨ ప్రొడక్షన్ గోల్డెన్ రూల్స్ (Golden Rules):

1. Fail Early, Fail Fast: పారామీటర్లు చెల్లకపోతే ప్రారంభంలోనే ఎక్సెప్షన్ విసిరి బయటకు రండి.
2. కస్టమ్ డొమైన్ ఎర్రర్స్: వ్యాపార నియమాల వైఫల్యాలకు అర్థవంతమైన కస్టమ్ ఎక్సెప్షన్స్ రూపొందించండి.
3. AutoCloseable వాడకం: అన్ని క్లౌడ్ సాకెట్లు, డేటాబేస్ పూల్స్ కు try-with-resources వాడండి.
4. కాజ్ ప్రిజర్వేషన్ (Chained Exceptions): ఒరిజినల్ ఎర్రర్‌ను కస్టమ్ ఎక్సెప్షన్‌గా ర్యాప్ చేసేటప్పుడు super(message, cause) ద్వారా మూల కారణాన్ని దాచకుండా ఉంచండి.

🧠 మీ అవగాహనను పరీక్షించుకోండి (5 Interactive Quizzes):

ప్రశ్న 1: Error మరియు Exception మధ్య ప్రధాన వ్యత్యాసం ఏమిటి?

సమాధానం: Error (ఉదా: OutOfMemoryError) అనేది రికవరీ చేయలేని JVM స్థాయి వైఫల్యం; Exception ను కోడ్ లో try-catch ద్వారా క్యాచ్ చేసి సాధారణ రన్‌ను కొనసాగించవచ్చు.

ప్రశ్న 2: Checked Exceptions ని కంపైలర్ ఎప్పుడు తనిఖీ చేస్తుంది?

సమాధానం: కంపైలేషన్ సమయంలోనే (Compile-time). వాటికి try-catch లేదా throws లేకపోతే కోడ్ అసలు కంపైల్ కాదు.

ప్రశ్న 3: try-with-resources స్టేట్‌మెంట్ వాడాలంటే ఆ రిసోర్స్ ఏ ఇంటర్‌ఫేస్‌ను ఇంప్లిమెంట్ చేయాలి?

సమాధానం: java.lang.AutoCloseable (లేదా java.io.Closeable) ఇంటర్‌ఫేస్‌ను ఇంప్లిమెంట్ చేయాలి.

ప్రశ్న 4: 'finally' బ్లాక్ ఎగ్జిక్యూషన్ ఎప్పుడు విఫలమవుతుంది?

సమాధానం: కోడ్ లో System.exit(0); పిలిచినప్పుడు లేదా పవర్ కట్ / OS ప్రాసెస్ క్రాష్ అయినప్పుడు మాత్రమే finally రన్ అవ్వదు.

ప్రశ్న 5: throw మరియు throws మధ్య తేడా ఏమిటి?

సమాధానం: throw అనేది వాస్తవంగా ఎక్సెప్షన్‌ను విసరడానికి వాడే యాక్షన్; throws అనేది మెథడ్ సిగ్నేచర్ వద్ద ఎక్సెప్షన్ రావచ్చని కాలర్లను హెచ్చరించే డిక్లరేషన్.

← మునుపటి పాఠం: 19. Abstract Classes & Interfaces తర్వాతి పాఠం: 21. List: ArrayList & LinkedList →