← Back to JavaScript Course | Chapter 8: Error Handling | Lesson 5 of 6

JS साइलेंट Errors

हर error खुद को ज़ोर से नहीं बताता -- कुछ चुपचाप fail हो जाते हैं, कोई दिखने वाला crash नहीं करते पर बस वह नहीं करते जो इरादा था, जैसे एक typo'd event listener जो कभी fire नहीं होता, या एक async operation जिसकी rejection कभी catch नहीं होती। ये silent failures अक्सर एक ज़ोरदार, साफ crash से debug करना ज़्यादा मुश्किल होते हैं।

Error को "Silent" क्या बनाता है

एक silent error कोई crash नहीं देता, कोई दिखने वाला error message नहीं, और कोई साफ संकेत नहीं कि कुछ गलत हुआ -- code बस वह नहीं करता जो इरादा था, जो समस्या की ओर इशारा करते एक साफ stack trace वाले ज़ोरदार crash से debug करना कहीं ज़्यादा उलझाने वाला हो सकता है।

Note: जब कोई चीज़ बिना किसी दिखने वाले error के 'बस काम नहीं करती', तो पहले एक silent failure पर शक करें -- swallowed exceptions, unhandled rejections, या किसी condition के चुपचाप कुछ अनपेक्षित evaluate होने की जांच करें।
Warning: एक silent error production में लंबे समय तक बिना नोटिस हुए रह सकता है, क्योंकि कुछ भी किसी को alert नहीं करता कि यह हो रहा है, एक ज़ोरदार crash के उलट जिसे users या monitoring tools तुरंत report कर देते।

उदाहरण: What Makes an Error "Silent"

javascript
function divide(a, b) {
  if (b === 0) return; // no crash, no error - just wrong silently
  return a / b;
}
console.log(divide(10, 0)); // undefined, no indication of why

Unhandled Promise Rejections

बिना .catch() के reject होने वाला एक Promise (या एक async function जिसकी error कभी catch नहीं होती) एक "unhandled rejection" पैदा करता है -- browser आमतौर पर console में एक warning log करता है, पर चल रही application में कुछ भी असल में react नहीं करता या failure को user तक नहीं पहुंचाता।

Note: अपने code के लिए मायने रखने वाली किसी भी Promise chain से हमेशा एक .catch() जोड़ें (या awaits को try/catch में लपेटें), भले ही handler फिलहाल बस error को log करे।
Warning: development के दौरान unhandled rejection की console warning चूकना आसान है, और users को console output बिल्कुल नहीं दिखता -- failure production में पूरी तरह unnoticed रह सकता है।

उदाहरण: Unhandled Promise Rejections

javascript
Promise.reject("Something failed"); // no .catch() - unhandled rejection warning only, nothing reacts

खाली या बहुत ज़्यादा Broad Catch Blocks

एक catch block जो caught error के साथ कुछ नहीं करता -- catch (e) {} -- failure को पूरी तरह दबा देता है, असल में उसे नज़र से छुपा देता है।

यह कभी-कभी किसी genuinely optional operation के लिए जानबूझकर किया जाता है, पर कहीं ज़्यादा बार यह गलती से किसी investigate करने लायक असली समस्या को छुपा देता है।

Note: कम से कम, किसी catch block को खाली छोड़ने के बजाय caught error को log करें (शुरुआती development के दौरान भी), ताकि कोई असली समस्या चुपचाप गायब न हो।
Warning: development के दौरान 'अस्थायी रूप से' इस्तेमाल किया गया एक खाली catch block भूल जाना और वैसा ही छोड़ देना आसान है, जो भी errors वह catch करता है उन्हें हमेशा के लिए छुपाते हुए।

उदाहरण: Empty or Overly Broad Catch Blocks

javascript
try {
  JSON.parse("bad json");
} catch (e) {} // swallowed silently, hides a real problem
console.log("Continues as if nothing happened");

Optional Chaining और ?? से Silent Failures

Optional chaining (?.) और nullish coalescing (??) genuinely optional data के लिए बेहतरीन हैं, पर इन्हें हर जगह ज़्यादा इस्तेमाल करना उस स्थिति को छुपा सकता है जहाँ किसी value का गायब होना असल में एक असली bug दिखाता है -- अनपेक्षित condition को सामने लाने के बजाय चुपचाप undefined या किसी default पर fallback होते हुए।

Note: ?. और ?? को खासतौर पर उन values के लिए रखें जो genuinely, वैध रूप से optional हैं -- उन values के लिए जो हमेशा मौजूद होनी चाहिए, गायब होने पर उसे एक साफ error के रूप में सामने आने दें।
Warning: किसी codebase में हर जगह 'सिर्फ एहतियातन' defensively ?. इस्तेमाल करना उस exact जगह को छुपा सकता है जहाँ कोई value अनपेक्षित रूप से गायब हुई, जिससे आखिरी bug को उसके source तक ट्रेस करना कहीं ज़्यादा मुश्किल हो जाता है।

उदाहरण: Silent Failures from Optional Chaining and ??

javascript
const user = { profile: null };
console.log(user.profile?.name ?? "Unknown"); // masks whether this is expected or a real bug

Silent Failures का पता लगाना

silent failures को सामने लाने के लिए खासतौर पर tools मौजूद हैं: browser का unhandledrejection event बिना .catch() वाली किसी भी Promise rejection के लिए fire होता है, और linters खाली catch blocks या गायब return statements को अपने आप flag कर सकते हैं, कई silent-failure patterns को production तक पहुंचने से पहले ही पकड़ते हुए।

Note: बिना किसी खास handler के फिसल जाने वाली किसी भी Promise rejection को पकड़ने के लिए development के दौरान (या production error tracking में) एक global window.addEventListener("unhandledrejection", ...) handler जोड़ें।
Warning: हर silent-failure pattern को पकड़ने के लिए सिर्फ manual code review पर निर्भर रहना scale पर अविश्वसनीय है -- automated tools (linters, error tracking services) इनमें से कहीं ज़्यादा लगातार पकड़ते हैं।

उदाहरण: Detecting Silent Failures

javascript
window.addEventListener("unhandledrejection", (e) => console.log("Caught silent rejection:", e.reason));
Promise.reject("oops");
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. बिना .catch() (या await के चारों ओर try/catch) के कोई async function या Promise chain लिखना, जिससे एक rejection एक visible error की तरह दिखने के बजाय चुपचाप गायब हो जाती है।
  2. optional chaining (?.) का इतना ज़्यादा इस्तेमाल करना कि कोई genuinely unexpected missing property अपने असली source के पास एक helpful error की तरह दिखने के बजाय चुपचाप undefined return कर दे।
  3. किसी error को broadly catch करना और उसके साथ कुछ न करना (एक empty catch block), असल में उस information को swallow करते हुए जो किसी असली problem को diagnose करने में मदद करती।
चैप्टर सारांश
  • एक silent error वह है जो बिना किसी visible crash, warning, या console output के fail हो जाती है -- अक्सर एक loud error से notice और debug करना ज़्यादा मुश्किल होती है।
  • एक unhandled Promise rejection (कोई .catch() नहीं) asynchronous code में silent failures का एक बहुत common source है।
  • एक empty या बहुत ज़्यादा broad catch block गलती से genuinely useful error information को suppress कर सकता है।
ब्राउज़र सपोर्ट

browser का unhandledrejection event और silent failures के लिए console warnings हर modern browser में supported हैं, उन issues को surface करने में मदद करते हुए जो वरना notice नहीं होते।

🔒

Chapter Quiz — Complete all 6 topics to unlock

0/6 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.