JavaScript Error Handling & localStorage: ప్రొడక్షన్-గ్రేడ్ యాప్ భద్రత మరియు డేటా స్టోరేజ్ (మాస్టర్ గైడ్)

🟨 JavaScript (ES2026+) 🟢 Lesson 25 of 25 (గ్రాండ్ ఫినాలే) 📂 Part 05: Modern & Advanced JS (Page 4 of 4) ⏱️ 18 min read
📌 Covered in this lesson: Circus Safety Net Analogy · try, catch, finally, throw Architecture · JS Error Types · Fridge Magnet Analogy for Web Storage · localStorage vs sessionStorage · Safe JSON Persistence Pattern · 5 Production Pitfalls · Course Completion Roadmap

సాధారణ కోడర్ రాసే ప్రోగ్రామ్ సరైన ఇన్‌పుట్ ఇచ్చినప్పుడు మాత్రమే పనిచేస్తుంది; కానీ ఒక సీనియర్ సాఫ్ట్‌వేర్ ఇంజనీర్ రాసే కోడ్, ఊహించని సర్వర్ వైఫల్యాలు లేదా తప్పుడు డేటా వచ్చినా యాప్ క్రాష్ అవ్వకుండా హుందాగా ఎదుర్కొంటుంది (Graceful Degradation). అదే సమయంలో, యూజర్ పేజీని రీఫ్రెష్ చేసినా లేదా బ్రౌజర్ మూసి మళ్ళీ తెరిచినా తన సెట్టింగ్స్, థీమ్, మరియు కార్ట్ ఐటమ్స్ చెక్కుచెదరకుండా ఉంచడం ప్రొడక్షన్ యాప్స్‌కి ప్రాణం.

🎪 1. సర్కస్ సేఫ్టీ నెట్ రూపకం (Circus Safety Net Analogy - Error Handling):
సర్కస్ గుడారంలో ఎత్తైన తాడుపై లేదా ట్రాపెజ్ ఊయల మీద విన్యాసాలు చేసే కళాకారుడు try బ్లాక్ లాంటివాడు. కింద పెద్ద ఎత్తున కట్టిన రక్షక వల (Safety Net) catch బ్లాక్. ఒకవేళ గాల్లో పట్టు తప్పి కళాకారుడు జారినా, కింద నేలకు గుద్దుకుని ప్రాణం పోకుండా (బ్రౌజర్ వైట్ స్క్రీన్ అయి మొత్తం యాప్ ఆగిపోకుండా), ఆ సేఫ్టీ నెట్ అతడిని ఒడిసి పట్టుకుంటుంది! యూజర్‌కి ఒక మర్యాదపూర్వక సందేశం ఇచ్చి యాప్ సేఫ్‌గా నడుస్తుంది. ఇక విన్యాసం విజయవంతమైనా లేదా నెట్‌లో పడిపోయినా.. షో ముగిశాక స్టేజ్ లైట్లు ఆపి హాల్ శుభ్రపరిచే పనివాడే finally (రిసోర్స్‌లు క్లీనప్ చేయడం, లోడింగ్ స్పిన్నర్లు దాచడం).

🧲 2. ఫ్రిజ్ అయస్కాంతం రూపకం (Fridge Magnet Analogy - localStorage):
జావాస్క్రిప్ట్ వేరియబుల్స్ కంప్యూటర్ RAM లో ఉంటాయి — అవి వైట్‌బోర్డు మీద చాక్ పీస్‌తో రాసిన రాతల్లాంటివి. పేజీ రీఫ్రెష్ అవ్వగానే తుడిచిపెట్టుకుపోతాయి. అదే localStorage అనేది మీ వంటింటి ఫ్రిజ్ డోర్‌కు తగిలించిన అయస్కాంతం (Fridge Magnet) లాంటిది! రాత్రి లైట్లు ఆపేసినా, పవర్ పోయి మళ్ళీ వచ్చినా, ఫ్రిజ్ రీస్టార్ట్ అయినా ఆ అయస్కాంత స్టిక్కర్ అక్కడే భద్రంగా ఉంటుంది. బ్రౌజర్ క్లోజ్ చేసి మరుసటి రోజు కంప్యూటర్ ఆన్ చేసినా యూజర్ డేటా సేఫ్‌గా లభిస్తుంది.

📋 ఈ Page లో ఏముంది? (Contents)

1. జావాస్క్రిప్ట్ లో ఎర్రర్స్ ఎందుకు వస్తాయి? అన్‌హ్యాండిల్డ్ ఎర్రర్ ప్రమాదం

జావాస్క్రిప్ట్ లైన్-బై-లైన్ ఎగ్జిక్యూట్ అయ్యే లాంగ్వేజ్. మీ ప్రోగ్రామ్‌లో 100 లైన్ల కోడ్ ఉండి, 15వ లైన్ వద్ద ఒక వేరియబుల్ తప్పుగా డిక్లేర్ అయినా లేదా లేని ప్రాపర్టీని చదవబోయినా (ఉదా: user.address.city లో address `undefined` అయితే), జావాస్క్రిప్ట్ ఇంజిన్ వెంటనే Fatal Exception ని త్రో చేస్తుంది.

🚨 అన్‌హ్యాండిల్డ్ ఎర్రర్ జరిగితే యూజర్‌కు ఏం జరుగుతుంది?

మీరు రక్షక కవచం (try...catch) ఏర్పాటు చేయకపోతే, ఆ ఎర్రర్ వచ్చిన మరుక్షణమే స్క్రిప్ట్ ఎగ్జిక్యూషన్ శాశ్వతంగా ఆగిపోతుంది! కింద ఉన్న 16 నుండి 100 వరకు లైన్లు ఎప్పటికీ రన్ కావు. బటన్లు క్లిక్ చేయడం ఆగిపోతాయి, పేజీ ఫ్రీజ్ అవుతుంది, యూజర్ నిస్సహాయంగా పేజీని వదిలి వెళ్ళిపోతాడు. ఈ పరిస్థితి రాకుండా అడ్డుకోవడమే Exception Handling.

2. try...catch...finally నిర్మాణ క్రమం & throw new Error()

జావాస్క్రిప్ట్ ఎర్రర్ హ్యాండ్లింగ్ సింటాక్స్ నాలుగు మూలస్తంభాలపై ఆధారపడి ఉంటుంది:

కీవర్డ్ బాధ్యత / పాత్ర వాస్తవ ప్రవర్తన (Real Behavior)
try రిస్క్ ఉన్న కోడ్ ప్రాంతం ఎర్రర్ వచ్చే అవకాశం ఉన్న కోడ్‌ను ఈ బ్లాక్‌లో ఉంచుతారు. ఇక్కడ ఎర్రర్ రాకపోతే ప్రశాంతంగా పూర్తవుతుంది; ఎర్రర్ రాగానే తదుపరి లైన్లు ఆగి వెంటనే catch కి జంప్ అవుతుంది.
catch (error) సేఫ్టీ నెట్ / రక్షకుడు try లో ఎర్రర్ తలెత్తినప్పుడు మాత్రమే ఇది రన్ అవుతుంది. ఆ ఎర్రర్ యొక్క పూర్తి సమాచారాన్ని (error.message, error.name) అందుకుని లాగ్ చేస్తుంది లేదా యూజర్‌కి అర్థమయ్యేలా అలర్ట్ ఇస్తుంది.
finally గ్యారెంటీడ్ క్లీనప్ వర్కర్ try విజయవంతమైనా, లేదా catch లో ఎర్రర్ పడినా.. ఖచ్చితంగా ప్రతిసారీ రన్ అవుతుంది! నెట్‌వర్క్ లోడింగ్ స్పిన్నర్లను దాచడానికి, డేటాబేస్ లేదా ఫైల్ కనెక్షన్లను మూసివేయడానికి ఇది ఉపయోగపడుతుంది.
throw మ్యానువల్ ఎలక్ట్రిక్ అలారం సిస్టమ్ ఎర్రర్ కోసం ఎదురుచూడకుండా, మీ వ్యాపార నిబంధనలు (Business Rules) ఉల్లంఘించబడినప్పుడు మీరే స్వయంగా throw new Error("సందేశం") ద్వారా ఎర్రర్‌ను సృష్టించవచ్చు.

4. జావాస్క్రిప్ట్ లోని 5 ముఖ్యమైన బిల్ట్-ఇన్ Error రకాలు

జావాస్క్రిప్ట్ ఏదైనా పొరపాటు జరిగినప్పుడు ఒక ప్రామాణిక Error ఆబ్జెక్ట్‌ను సృష్టిస్తుంది. అందులో తరచుగా కనిపించే 5 రకాలు:

5. లైవ్ కోడ్ ఉదాహరణ: ప్రొడక్షన్ బ్యాంకింగ్ లావాదేవీల ఇంజిన్

కింది కోడ్‌లో మనం ఒక బ్యాంకింగ్ ఫండ్ ట్రాన్స్‌ఫర్ ఫంక్షన్‌ను నిర్మించాం. తప్పుడు అమౌంట్ లేదా ఖాతాలో డబ్బు లేనప్పుడు throw new Error() ట్రిగ్గర్ అవుతుంది. విఫలమైనా లేదా గెలిచినా finally లోడింగ్ స్పిన్నర్‌ను శాశ్వతంగా ఆపివేస్తుంది:

JavaScript: Safe Transaction with try, catch, finally & throw
function processTransfer(fromAcc, toAcc, amount) {
  let spinner = true;
  try {
    if (amount <= 0) throw new Error("చెల్లని మొత్తం: 0 కంటే ఎక్కువ ఉండాలి!");
    if (fromAcc.balance < amount) throw new Error("ఖాతాలో నిధులు సరిపోవు!");
    fromAcc.balance -= amount;
    toAcc.balance += amount;
    console.log(`✅ విజయవంతం: ₹${amount} పంపబడింది. మిగిలిన నిల్వ: ₹${fromAcc.balance}`);
  } catch (err) {
    console.error(`❌ బదిలీ విఫలమైంది [${err.name}]: ${err.message}`);
  } finally {
    spinner = false;
    console.log("🔄 లోడింగ్ స్పిన్నర్ ఆపివేయబడింది. కనెక్షన్ ముగిసింది.");
  }
}
processTransfer({ id: 101, balance: 500 }, { id: 102, balance: 100 }, 800);

6. బ్రౌజర్ వెబ్ స్టోరేజ్: localStorage vs sessionStorage vs Cookies

వెబ్‌సైట్లలో యూజర్ సెట్టింగులు, లాగిన్ సెషన్లు లేదా కార్ట్ వివరాలను స్టోర్ చేయడానికి ఆధునిక HTML5 Web Storage API అత్యంత శక్తివంతమైన సాధనం. పూర్వకాలంలో దీనికోసం కుకీలు (Cookies) వాడేవారు, కానీ ఆధునిక యాప్స్‌లో వ్యత్యాసం ఇలా ఉంటుంది:

లక్షణం (Feature) localStorage sessionStorage Cookies
జీవితకాలం (Lifespan) శాశ్వతం (యూజర్ స్వయంగా క్లియర్ చేసేవరకు ఉంటుంది) ట్యాబ్ క్లోజ్ చేయగానే ఆటోమేటిక్‌గా డిలీట్ అవుతుంది ఎక్స్‌పైరీ డేట్ సెట్ చేసుకోవచ్చు
నిల్వ సామర్థ్యం (Capacity) ~5MB నుండి 10MB పర్ డొమైన్ ~5MB పర్ ట్యాబ్ కేవలం ~4KB మాత్రమే
నెట్‌వర్క్ బదిలీ క్లయింట్ బ్రౌజర్‌లోనే ఉంటుంది (సర్వర్‌కు వెళ్ళదు) క్లయింట్ బ్రౌజర్‌లోనే ఉంటుంది ప్రతి HTTP రిక్వెస్ట్‌తో పాటు సర్వర్‌కు వెళ్తుంది
ట్యాబ్‌ల మధ్య భాగస్వామ్యం అన్ని విండోలు/ట్యాబ్‌లలో షేర్ అవుతుంది ఆ నిర్దిష్ట ఒక్క ట్యాబ్‌కే పరిమితం అన్ని ట్యాబ్‌లలో షేర్ అవుతుంది
ఉత్తమ వినియోగం డార్క్ మోడ్ థీమ్, ఫేవరెట్స్, భాష ఎంపిక సింగిల్ సెషన్ ఫారమ్ డేటా, పేజీ విజార్డ్స్ సర్వర్ సైడ్ సెషన్ ఐడీలు, ఆథెంటికేషన్ టోకెన్లు

7. Core Storage API పద్ధతులు & JSON బ్రిడ్జి

localStorage మరియు sessionStorage రెండూ ఒకే రకమైన పద్ధతులను (Methods) కలిగి ఉంటాయి:

⚠️ అతి ముఖ్యమైన పరిమితి: localStorage Strings మాత్రమే తీసుకుంటుంది!

మీరు పొరపాటున ఒక JavaScript Object ని నేరుగా localStorage.setItem('user', {name: 'Ravi'}) అని రాస్తే, బ్రౌజర్ దాన్ని స్ట్రింగ్‌గా మార్చే క్రమంలో "[object Object]" అని సేవ్ చేసి డేటాను నాశనం చేస్తుంది!

రక్షణాత్మక మార్గం (The JSON Bridge):
1. సేవ్ చేసే ముందు: JSON.stringify(object) వాడి ఆబ్జెక్ట్‌ను స్ట్రింగ్‌గా మార్చాలి.
2. బయటకు తీశాక: JSON.parse(string) వాడి తిరిగి అసలైన జావాస్క్రిప్ట్ ఆబ్జెక్ట్‌గా మార్చుకోవాలి.

8. లైవ్ కోడ్ ఉదాహరణ: ఫెయిల్-సేఫ్ లోకల్ స్టోరేజ్ స్టేట్ మేనేజర్

ప్రొడక్షన్ సైట్లలో బ్రౌజర్ స్టోరేజ్ నిండిపోయినా (QuotaExceededError) లేదా యూజర్ ప్రైవేట్ బ్రౌజింగ్ వల్ల స్టోరేజ్ బ్లాక్ అయినా యాప్ క్రాష్ కాకుండా రక్షించే ప్రొడక్షన్-గ్రేడ్ హెల్పర్ ఆబ్జెక్ట్:

JavaScript: Safe LocalStorage Manager with JSON & Fallback
const Storage = {
  save(key, val) {
    try {
      localStorage.setItem(key, JSON.stringify(val));
    } catch (e) {
      console.warn("స్టోరేజ్ కోటా దాటిపోయింది లేదా ప్రైవేట్ మోడ్ లోపం!", e.message);
    }
  },
  load(key, fallback = null) {
    try {
      const item = localStorage.getItem(key);
      return item ? JSON.parse(item) : fallback;
    } catch {
      return fallback;
    }
  }
};
Storage.save("user_pref", { theme: "dark", fontSize: 16 });
console.log("తేబడిన యూజర్ అమరికలు:", Storage.load("user_pref"));

9. డెవలపర్లు చేసే 5 ప్రమాదకరమైన ప్రొడక్షన్ తప్పులు (Pitfalls)

రియల్ వరల్డ్ ప్రాజెక్టులలో డెవలపర్లు తరచుగా చేసే ఈ 5 తప్పులను మీరు నివారించగలిగితే మీ కోడ్ అత్యంత పటిష్టంగా మారుతుంది:

1. నిశ్శబ్ద క్యాచ్ బ్లాక్స్ (Silent / Empty Catch Blocks - బ్లాక్ హోల్ ప్రమాదం)

catch (err) { } అని ఖాళీగా వదిలేయడం అత్యంత ప్రమాదకరం. దీనివల్ల ప్రొడక్షన్‌లో బగ్స్ ఎందుకు వస్తున్నాయో ఎవ్వరికీ అర్థం కాదు. కనీసం కన్సోల్ వార్నింగ్ ఇవ్వడం లేదా Sentry/LogRocket లాంటి మోనిటరింగ్ టూల్స్‌కు పంపడం అలవాటు చేసుకోవాలి.

2. ఆబ్జెక్ట్‌ను నేరుగా స్టోర్ చేసి `[object Object]` గా మార్చడం

localStorage.setItem('cart', cartArray) రాస్తే అది డేటాను పాడుచేస్తుంది. ఆరేలు, ఆబ్జెక్టులు నిల్వ చేసే ప్రతిసారీ JSON.stringify() ను తప్పనిసరిగా వాడాలి.

3. అసురక్షిత `JSON.parse()` వాడకం వల్ల యాప్ క్రాష్ అవ్వడం

కీ లేనప్పుడు localStorage.getItem('unknown') ఇచ్చేది null. కానీ పొరపాటున స్టోరేజ్ లో చెల్లని టెక్స్ట్ ఉంటే JSON.parse() మొత్తం యాప్‌ను క్రాష్ చేస్తుంది. కాబట్టి JSON.parse() ను ఎల్లప్పుడూ try...catch లోపు లేదా డిఫాల్ట్ ఫాల్‌బ్యాక్‌తో మాత్రమే వాడాలి.

4. localStorage లో రహస్య పాస్‌వర్డ్‌లు, సెన్సిటివ్ బ్యాంకింగ్ టోకెన్లు దాచడం

బ్రౌజర్‌లో రన్ అయ్యే ఏ 3rd-party స్క్రిప్ట్ లేదా XSS (Cross-Site Scripting) అటాక్ అయినా localStorage లోని డేటాను సులభంగా దొంగిలించగలదు. కాబట్టి బ్యాంకింగ్ పాస్‌వర్డ్‌లు, యూజర్ క్రెడిట్ కార్డుల సమాచారాన్ని ఎప్పుడూ లోకల్ స్టోరేజ్‌లో పెట్టకూడదు. దీనికి HttpOnly Cookies మాత్రమే సురక్షితమైనవి.

5. Asynchronous కోడ్ లో Synchronous try/catch వాడటం

setTimeout లేదా సాధారణ Promise కాల్స్ చుట్టూ సాధారణ try/catch పెడితే అది పనిచేయదు! ఎందుకంటే ఎర్రర్ వచ్చే సమయానికి కాల్ స్టాక్ ఖాళీ అయిపోతుంది. అసింక్రోనస్ కోడ్‌లో ఎర్రర్ పట్టాలంటే ఫంక్షన్ ముందు async పెట్టి లోపల await రాస్తేనే try/catch క్యాచ్ చేయగలదు.

10. ఇంటర్వ్యూ & ప్రాక్టీస్ ప్రశ్నలు (రియల్-వరల్డ్ వివరణలతో)

ఈ క్రింది ప్రశ్నలకు స్వయంగా సమాధానం చెప్పడానికి ప్రయత్నించండి, ఆపై మీ సమాధానాన్ని పరిశీలించండి:

  1. try బ్లాక్‌లో return స్టేట్‌మెంట్ ఉన్నప్పటికీ finally బ్లాక్ రన్ అవుతుందా?
  2. యూజర్ బ్రౌజర్‌లో 5MB పరిమితి మించి డేటా సేవ్ చేయబోతే ఏ ఎర్రర్ వస్తుంది?
  3. JSON.parse(null) మరియు JSON.parse(undefined) ఏమి ఫలితాలు ఇస్తాయి?
  4. జావాస్క్రిప్ట్ లో throw "error" కంటే throw new Error("error") ఎందుకు ఉత్తమం?
  5. యూజర్ Incognito (ప్రైవేట్ బ్రౌజింగ్) మోడ్ లో ఉన్నప్పుడు localStorage ఎలా ప్రవర్తిస్తుంది?
  6. ఒకే డొమైన్ లోని రెండు వేర్వేరు ట్యాబ్‌ల మధ్య sessionStorage షేర్ అవుతుందా?
👉 సమాధానాలు మరియు వివరణలు చూడండి (Click to Expand)

1. సమాధానం: అవును, ఖచ్చితంగా రన్ అవుతుంది! try లో return 10; రాసినా కూడా, ఆ ఫంక్షన్ ఎగ్జిట్ అయ్యే ముందే finally లోని కోడ్ తప్పకుండా ఎగ్జిక్యూట్ అవుతుంది.

2. సమాధానం: QuotaExceededError (DOMException) తలెత్తుతుంది. అందుకే స్టోరేజ్ సేవ్ ఆపరేషన్లను ఎల్లప్పుడూ try...catch లో ఉంచాలి.

3. సమాధానం: JSON.parse(null) సురక్షితంగా null ని ఇస్తుంది; కానీ JSON.parse(undefined) మాత్రం భయంకరమైన SyntaxError: Unexpected token u in JSON ని విసురుతుంది!

4. సమాధానం: new Error() వాడటం వల్ల ఎర్రర్ ఎక్కడ, ఏ ఫైల్ లో, ఎన్నో లైన్ లో వచ్చిందో చెప్పే Call Stack Trace (err.stack) ఆటోమేటిక్‌గా అటాచ్ అవుతుంది. సాధారణ స్ట్రింగ్‌కు స్టాక్ ట్రేస్ ఉండదు.

5. సమాధానం: చాలా ఆధునిక బ్రౌజర్లలో ప్రైవేట్ విండో ఓపెన్ ఉన్నంతవరకు మాత్రమే ఇన్-మెమరీగా స్టోర్ అవుతుంది, విండో మూయగానే తుడిచిపెట్టుకుపోతుంది. కొన్ని పాత బ్రౌజర్లు ఏకంగా ఎక్సెప్షన్ త్రో చేస్తాయి.

6. సమాధానం: షేర్ అవ్వదు. sessionStorage అనేది కేవలం ఆ ఒక్క నిర్దిష్ట ట్యాబ్‌కే పరిమితం. పక్క ట్యాబ్‌లో అదే సైట్ తెరిచినా దానికి సరికొత్త ఖాళీ సెషన్ ప్రారంభమవుతుంది.

📌 సారాంశం (Quick Summary):

  • try...catch: యాప్ క్రాష్ అవ్వకుండా ఆపి గౌరవప్రదంగా ఎర్రర్‌ను హ్యాండిల్ చేస్తుంది.
  • finally: ఫెయిలైనా లేదా గెలిచినా క్లీనప్ పనులు చేయడానికి గ్యారెంటీగా రన్ అవుతుంది.
  • throw: మీ బిజినెస్ లాజిక్‌కు భంగం కలిగినప్పుడు స్వయంగా కస్టమ్ ఎర్రర్‌ను త్రో చేస్తుంది.
  • localStorage: 5-10MB సామర్థ్యంతో బ్రౌజర్‌లో డేటాను శాశ్వతంగా దాచే ఫ్రిజ్ అయస్కాంతం.
  • JSON Bridge: స్టోరేజ్ కేవలం స్ట్రింగ్స్ మాత్రమే తీసుకుంటుంది కాబట్టి JSON.stringify మరియు JSON.parse వాడటం తప్పనిసరి.
🏆 🎓 🚀

అభినందనలు! జావాస్క్రిప్ట్ 25 అధ్యాయాల మాస్టర్‌క్లాస్ పూర్తయింది!

మీరు మొదటి అధ్యాయంలో Variables, Data Types, Operators నుండి ప్రారంభించి.. Loops, Functions, Arrays, Objects నేర్చుకుని.. బ్రౌజర్ లో DOM Manipulation, Events, Form Validation, To-Do List Project నిర్మించి.. ఆపై అత్యంత శక్తివంతమైన Closures, Destructuring, Promises, async/await, Fetch API మరియు ఈ చివరి పాఠంలో Error Handling & localStorage వరకు విజయవంతంగా నేర్చుకున్నారు!

🗺️ మీ తదుపరి అడుగులు (Next Level Developer Roadmap):

  • Frontend Frameworks: React.js లేదా Next.js నేర్చుకుని కాంపోనెంట్ బేస్డ్ మోడరన్ యాప్స్ నిర్మించండి.
  • Backend Engineering: Node.js మరియు Express.js ద్వారా మీ స్వంత REST APIs మరియు డేటాబేస్ లను అనుసంధానించండి.
  • Type Safety: పెద్ద ఎంటర్‌ప్రైజ్ ప్రాజెక్టుల కోసం TypeScript నేర్చుకోండి.
📚 జావాస్క్రిప్ట్ మెయిన్ ఇండెక్స్ & అన్ని అధ్యాయాలు → ▶ లైవ్ కోడ్ ఎడిటర్‌లో ప్రాక్టీస్ చేయండి