पहले पैरामीटर क्यों?
Node.js की अतुल्यकालिक प्रकृति के कारण, उपयोगकर्ता -पैरामीटर Node.js त्रुटि हैंडलिंग के लिए एक कन्वेंशन के रूप में पहला पैरामीटर-एर्स-इरेट अच्छी तरह से स्थापित हो गया है । यह अतुल्यकालिक है क्योंकि:
try {
setTimeout(function() {
throw 'something broke' //Some random error
}, 5)
}
catch(e) {
//Will never get caught
}
इसलिए कॉलबैक के पहले तर्क के बजाय त्रुटियों को केवल अतुल्यकालिक रूप से पारित करने के अलावा उन्हें फेंकने के लिए बहुत ही समझदार तरीका है।
ऐसा करने का परिणाम unhandled exception
यह होगा कि जिस तरह से यह लग रहा है, इसका मतलब है कि आवेदन को अपनी उलझन की स्थिति से बाहर निकालने के लिए कुछ भी नहीं किया गया था।
अपवाद, वे क्यों मौजूद हैं
हालांकि, यह ध्यान देने योग्य है कि लगभग सभी Node.js का हिस्सा इवेंट-एमिटर हैं और एक अपवाद को फेंकना एक निम्न-स्तरीय घटना है जिसे सभी घटनाओं की तरह संभाला जा सकता है:
//This won't immediately crash if connection fails
var socket = require("net").createConnection(5000);
socket.on("error", function(err) {
console.error("calm down...", err)
});
इस बल्कि नहीं करना चाहिए कर सकते हैं चरम पर ले जाया सभी त्रुटियों को पकड़ने और एक आवेदन जो बहुत मुश्किल करने के लिए कभी नहीं दुर्घटना की कोशिश करेंगे कर सकते हैं। लगभग हर उपयोग-मामले में यह एक भयानक विचार है, क्योंकि यह डेवलपर को आवेदन राज्य में चल रहे किसी भी विचार के बिना छोड़ देगा और कोशिश-कैच में मुख्य लपेटने के अनुरूप है।
डोमेन - घटनाओं को तार्किक रूप से समूहीकृत करना
अपवादों की इस समस्या से निपटने के लिए, जिससे आवेदन गिर जाते हैं, डोमेन डेवलपर को एक्सप्रेस .js आवेदन के लिए अनुमति देते हैं, और भयावह विफलता की स्थिति में कनेक्शन को सावधानीपूर्वक बंद करने का प्रयास करते हैं।
ES6
यह शायद उल्लेख कर रहा है कि यह फिर से बदल जाएगा क्योंकि ES6 जनरेटर पैटर्न को अतुल्यकालिक घटनाओं को बनाने की अनुमति देता है जो अभी भी कोशिश या पकड़ने वाले ब्लॉक के साथ उपलब्ध हैं।
Koa (TJ Holowaychuck द्वारा लिखित, Express.js का एक ही मूल लेखक) ध्यान देने योग्य रूप से ऐसा करता है। यह yield
ब्लॉक बनाने के लिए ES6 स्टेटमेंट का उपयोग करता है, जो लगभग सिंक्रोनस दिखाई देते हुए, सामान्य नोड अतुल्यकालिक फैशन में संभाला जाता है:
app.use(function *(next) {
try {
yield next;
}
catch (err) {
this.status = err.status || 500;
this.body = err.message;
this.app.emit('error', err, this);
}
});
app.use(function *(next) {
throw new Error('some error');
})
यह उदाहरण यहाँ से बेशर्मी से चुराया गया था ।