Node.js 中的异常处理
异常处理是指处理应用程序运行时代码中发生的异常的机制。 Node.js 支持多种传播和处理错误的机制。
以下是可用于 Node.js 中的异常处理的不同方法:
- 同步代码中的异常处理:如果同步代码发生错误,则返回错误。
例子:
javascript
// Write Javascript code here
// Define divider as a synchronous function
var divideSync = function(x, y) {
// if error condition?
if ( y === 0 ) {
// "throw" the error safely by returning it
return new Error("Can't divide by zero")
}
else {
// no error occurred, continue on
return x/y
}
}
// Divide 9/3
var result = divideSync(9, 3)
// did an error occur?
if ( result instanceof Error ) {
// handle the error safely
console.log("9/3=err", result)
}
else {
// no error occurred, continue on
console.log("9/3="+result)
}
// Divide 9/0
result = divideSync(9, 0)
// did an error occur?
if ( result instanceof Error ) {
// handle the error safely
console.log("9/0=err", result)
}
else {
// no error occurred, continue on
console.log("9/0="+result)
}
javascript
// Write Javascript code here
var divide = function(x, y, next) {
// if error condition?
if ( y === 0 ) {
// "throw" the error safely by calling the completion callback
// with the first argument being the error
next(new Error("Can't divide by zero"))
}
else {
// no error occurred, continue on
next(null, x/y)
}
}
divide(9, 3, function(err, result){
// did an error occur?
if ( err ) {
// handle the error safely
console.log("9/3=err", err)
}
else {
// no error occurred, continue on
console.log("9/3="+result)
}
})
divide(9, 0, function(err, result){
// did an error occur?
if ( err ) {
// handle the error safely
console.log("9/0=err", err)
}
else {
// no error occurred, continue on
console.log("9/0="+result)
}
})
javascript
// Write Javascript code here
// Definite our Divider Event Emitter
var events = require("events")
var Divider = function(){
events.EventEmitter.call(this)
}
require('util').inherits(Divider, events.EventEmitter)
// Add the divide function
Divider.prototype.divide = function(x, y){
// if error condition?
if ( y === 0 ) {
// "throw" the error safely by emitting it
var err = new Error("Can't divide by zero")
this.emit("error", err)
}
else {
// no error occurred, continue on
this.emit("divided", x, y, x/y)
}
// Chain
return this;
}
// Create our divider and listen for errors
var divider = new Divider()
divider.on('error', function(err){
// handle the error safely
console.log(err)
})
divider.on('divided', function(x, y, result){
console.log(x+"/"+y+"="+result)
})
// Divide
divider.divide(9, 3).divide(9, 0)
- 输出:
- 基于回调(异步)代码中的异常处理:在基于回调的代码中,回调的参数之一是 err。如果发生错误,则 err 是错误,如果没有发生错误,则 err 为空。 err 参数后面可以跟任意数量的其他参数。
例子:
javascript
// Write Javascript code here
var divide = function(x, y, next) {
// if error condition?
if ( y === 0 ) {
// "throw" the error safely by calling the completion callback
// with the first argument being the error
next(new Error("Can't divide by zero"))
}
else {
// no error occurred, continue on
next(null, x/y)
}
}
divide(9, 3, function(err, result){
// did an error occur?
if ( err ) {
// handle the error safely
console.log("9/3=err", err)
}
else {
// no error occurred, continue on
console.log("9/3="+result)
}
})
divide(9, 0, function(err, result){
// did an error occur?
if ( err ) {
// handle the error safely
console.log("9/0=err", err)
}
else {
// no error occurred, continue on
console.log("9/0="+result)
}
})
- 输出:
- 事件代码中的异常处理:在事件代码中,错误可能发生在任何地方。因此,与其抛出错误,不如触发错误事件。
例子:
javascript
// Write Javascript code here
// Definite our Divider Event Emitter
var events = require("events")
var Divider = function(){
events.EventEmitter.call(this)
}
require('util').inherits(Divider, events.EventEmitter)
// Add the divide function
Divider.prototype.divide = function(x, y){
// if error condition?
if ( y === 0 ) {
// "throw" the error safely by emitting it
var err = new Error("Can't divide by zero")
this.emit("error", err)
}
else {
// no error occurred, continue on
this.emit("divided", x, y, x/y)
}
// Chain
return this;
}
// Create our divider and listen for errors
var divider = new Divider()
divider.on('error', function(err){
// handle the error safely
console.log(err)
})
divider.on('divided', function(x, y, result){
console.log(x+"/"+y+"="+result)
})
// Divide
divider.divide(9, 3).divide(9, 0)
- 输出: