ทำไมพารามิเตอร์แรก
เพราะธรรมชาติไม่ตรงกันของ Node.js ที่พารามิเตอร์ตามที่ผิดพลาดครั้งแรกรูปแบบได้กลายเป็นที่ยอมรับในฐานะที่ประชุมสำหรับuserland จัดการข้อผิดพลาด นี่เป็นเพราะแบบอะซิงโครนัส:
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)
});
สิ่งนี้สามารถ - แต่ -ไม่ควรถูกนำไปสุดขีดเพื่อตรวจจับข้อผิดพลาดทั้งหมดและสร้างแอปพลิเคชันซึ่งจะพยายามอย่างหนักที่จะไม่ผิดพลาด นี่เป็นความคิดที่แย่มากในเกือบทุกกรณีการใช้งานเพราะมันจะทำให้นักพัฒนาซอฟต์แวร์ไม่มีความคิดว่าเกิดอะไรขึ้นในสถานะแอปพลิเคชัน
โดเมน - การจัดกลุ่มเหตุการณ์อย่างมีเหตุผล
ในฐานะที่เป็นส่วนหนึ่งของการจัดการกับปัญหาข้อยกเว้นที่ทำให้แอปพลิเคชันล้มเหลวโดเมนอนุญาตให้นักพัฒนาใช้ตัวอย่างเช่นแอปพลิเคชัน Express.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');
})
ตัวอย่างนี้ถูกขโมยลงคอจากที่นี่