मैंने अपने आवेदन में बेजोड़ अपवादों को संभालने के लिए निम्नलिखित कोड लिखा है (मुझे पता है कि यह दृष्टिकोण से निपटने में एक भोली त्रुटि है, कोड सिर्फ प्रश्न के उद्देश्य के लिए है):

process.on("uncaughtException", err => {
    console.log('Handling exception');
});

console.log('starting...');

function f() {
    throw(new Error('Error'));
}

f();
console.log('Done');

जब मैंने कोड चलाया, तो मुझे निम्न आउटपुट मिला:

starting...
Handling exception

किसी कारण से, भले ही अपवाद को संभाला गया हो, प्रोग्राम कोड की अंतिम पंक्ति को चलाए बिना बाहर निकल गया। जब मैंने कॉल को f() पर try-catch ब्लॉक के साथ लपेटा, तो अंतिम पंक्ति निष्पादित हुई और स्क्रीन पर 'डन' शब्द प्रिंट हो गया।

मेरे प्रश्न हैं:

  1. क्या यह अपेक्षित व्यवहार है?
  2. इन दो तंत्रों (घटना को सुनना और ट्राइ-कैच का उपयोग करके) के बीच अंतर क्यों है?
3
omer 27 जून 2019, 14:02

1 उत्तर

सबसे बढ़िया उत्तर

यह ठीक वैसा ही व्यवहार है जिसकी आप अपेक्षा करेंगे, न आया हुआ अपवाद स्क्रिप्ट के सामान्य निष्पादन को रोक देगा इसलिए "पूर्ण" लॉग कॉल कभी नहीं किया जाएगा।

आप इसका एक बेहतर उदाहरण यहां Node.js डॉक्स में देख सकते हैं: https://nodejs .org/api/process.html#process_event_uncaughtexception

जैसा कि दस्तावेज कहता है:

Note that 'uncaughtException' is a crude mechanism for exception handling intended to be used only as a last resort.

वे स्पष्ट रूप से लॉग इन करते हैं "यह नहीं चलेगा" क्योंकि यह अपेक्षित व्यवहार है।

यदि आप अपवाद को पकड़ते हैं तो स्क्रिप्ट निष्पादन बंद नहीं होगा और लॉग कॉल सामान्य रूप से की जाएगी।

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}`
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

UncaughtException हैंडलर ठीक ऐसा करने के लिए है: किसी भी अपवाद को पकड़ें जो try ... द्वारा हैंडल न किया गया हो। हैंडलर को अपने कोड में पकड़ें। मुख्य उद्देश्य त्रुटियों को लॉग करना होना चाहिए ताकि उन्हें बाद में ठीक किया जा सके।

किसी भी मामले में, स्क्रिप्ट को हमेशा के लिए पुनरारंभ तंत्र में लपेटना या ऐसा होने पर एक नया डॉकर कंटेनर कताई करना शायद सबसे अच्छा है।

अब आपके मामले में कोई वास्तविक अंतर नहीं है क्योंकि स्क्रिप्ट वैसे भी सीधे बाहर निकल जाएगी। लेकिन इन दो लिपियों के बीच के अंतर को देखें:

स्क्रिप्ट 1:

// Keep the script alive by setting a timeout. Because we have an exception handler in place we can keep doing stuff!
let interval = setInterval(() => console.log("I'm still alive!!"), 500);
setTimeout(() => { clearInterval(interval); console.log("Timeout done...")} , 5000);

process.on("uncaughtException", err => {
    console.log('Handling exception');
});

console.log('starting...');

function f() {
    throw(new Error('Error'));
}

f();

console.log('Done');

स्क्रिप्ट 2:

// Keep the script alive by setting a timeout. Since there is no exception handler set the script will terminate immediately in any case.

let interval = setInterval(() => console.log("I'm still alive!!"), 500);
setTimeout(() => { clearInterval(interval); console.log("Timeout done...")} , 5000);

console.log('starting...');

function f() {
    throw(new Error('Error'));
}

f();

console.log('Done');

आप दूसरी स्क्रिप्ट में देख सकते हैं कि हम सीधे बाहर निकल जाते हैं क्योंकि हमारे पास कोई अपवाद हैंडलर नहीं है।

3
Terry Lennox 27 जून 2019, 15:05