Node.js的Errors
模块和相关机制提供了详细的错误处理方法。在Node.js中,错误是Error
对象的实例,代表在代码执行期间发生的问题。Error
对象有多种类型,适用于不同的场景。
Error
对象在Node.js中,Error
是全局对象,不需要引入或加载任何模块。你可以直接使用它来创建和处理错误。
Error
对象的基础Error
对象的基本用法如下:
const error = new Error('Something went wrong');
console.error(error);
Error
构造函数**new Error([message[, fileName[, lineNumber]]])
**Error
对象可以用new
关键字创建。
示例:
const error = new Error('An unexpected error occurred');
console.error(error.message); // 输出: An unexpected error occurred
console.error(error.name); // 输出: Error
console.error(error.stack); // 输出: 错误的堆栈跟踪
Error
对象的属性message
错误消息的字符串,描述了错误的具体内容。
示例:
const error = new Error('Invalid input');
console.log(error.message); // 输出: Invalid input
name
错误的名称,通常是错误的类型,默认为Error
。当使用子类(如TypeError
或ReferenceError
)时,name
属性会自动更新为相应的类型。
示例:
const error = new Error('An error occurred');
console.log(error.name); // 输出: Error
const typeError = new TypeError('Type mismatch');
console.log(typeError.name); // 输出: TypeError
stack
错误的堆栈跟踪(stack trace),包含错误发生时的调用堆栈信息。stack
属性是一个字符串,通常包括Error
的名称、message
和堆栈信息。
示例:
function faultyFunction() {
throw new Error('Something went wrong');
}
try {
faultyFunction();
} catch (error) {
console.error(error.stack);
}
Node.js定义了多个内置的错误类型,这些类型继承自Error
对象,并提供更具体的错误描述:
EvalError
用于标识eval()
函数的使用问题。现代JavaScript很少使用这个错误类型,因为eval()
的使用被认为是不安全的。
try {
throw new EvalError('Evaluation failed');
} catch (e) {
console.error(e.name); // 输出: EvalError
console.error(e.message); // 输出: Evaluation failed
}
RangeError
当一个数值不在其允许的范围内时抛出。例如,Array
的length
属性设置为负值。
try {
const arr = new Array(-1);
} catch (e) {
console.error(e.name); // 输出: RangeError
console.error(e.message); // 输出: Invalid array length
}
ReferenceError
当引用一个不存在的变量时抛出。例如,使用一个未定义的变量。
try {
console.log(nonExistentVariable);
} catch (e) {
console.error(e.name); // 输出: ReferenceError
console.error(e.message); // 输出: nonExistentVariable is not defined
}
SyntaxError
当JavaScript解析器遇到代码语法错误时抛出。例如,函数声明错误。
try {
eval('function x( {}');
} catch (e) {
console.error(e.name); // 输出: SyntaxError
console.error(e.message); // 输出: Unexpected token '{'
}
TypeError
当变量或参数不是预期类型时抛出。例如,将非函数类型调用为函数。
try {
null.f();
} catch (e) {
console.error(e.name); // 输出: TypeError
console.error(e.message); // 输出: null is not an object
}
URIError
当使用全局URI处理函数时,URI格式不正确时抛出。例如,decodeURI()
和encodeURI()
。
try {
decodeURI('%');
} catch (e) {
console.error(e.name); // 输出: URIError
console.error(e.message); // 输出: URI malformed
}
AssertionError
(来自assert
模块)
当使用assert
模块进行断言时,如果断言失败,会抛出这个错误。
const assert = require('assert');
try {
assert.strictEqual(1, 2);
} catch (e) {
console.error(e.name); // 输出: AssertionError
console.error(e.message); // 输出: Expected values to be strictly equal:
// 1 !== 2
}
在Node.js中,你可以创建自定义错误类来扩展Error
对象,提供更详细的错误信息:
class CustomError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name; // 设置错误名称为类名
}
}
try {
throw new CustomError('This is a custom error');
} catch (e) {
console.error(e.name); // 输出: CustomError
console.error(e.message); // 输出: This is a custom error
console.error(e.stack); // 输出: 自定义错误的堆栈信息
}
错误处理是Node.js编程的核心部分。Node.js中的常见错误处理模式包括:
对于同步代码中的错误,可以使用try/catch
块捕获错误:
try {
// 可能会抛出错误的代码
throw new Error('Something went wrong!');
} catch (error) {
console.error('Caught error:', error.message);
}
回调函数中的错误处理
异步回调函数通常接受一个err
参数,如果有错误发生,err
将是一个Error
对象。
const fs = require('fs');
fs.readFile('nonexistentFile.txt', (err, data) => {
if (err) {
console.error('Error reading file:', err.message);
return;
}
console.log('File data:', data);
});
Promise
中的错误处理
使用Promise
处理异步操作时,可以使用.catch()
方法来处理错误。
const fs = require('fs').promises;
fs.readFile('nonexistentFile.txt')
.then((data) => {
console.log('File data:', data);
})
.catch((err) => {
console.error('Error reading file:', err.message);
});
async/await
中的错误处理
使用async/await
语法处理异步操作时,可以将await
语句包裹在try/catch
块中。
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('nonexistentFile.txt');
console.log('File data:', data);
} catch (err) {
console.error('Error reading file:', err.message);
}
}
readFile();
Node.js提供了一些全局错误处理方法来捕获未捕获的异常:
process.on('uncaughtException', callback)
当一个错误没有被捕获时,uncaughtException
事件被触发。使用此方法时要谨慎,因为未捕获的异常可能导致Node.js进程进入不可恢复的状态。
process.on('uncaughtException', (err) => {
console.error('Uncaught exception:', err);
});
throw new Error('This is an uncaught exception');
process.on('unhandledRejection', callback)
当一个Promise
被拒绝但没有被.catch()
处理时,unhandledRejection
事件被触发。
process.on('unhandledRejection', (reason, promise) => {
console.error
('Unhandled Rejection at:', promise, 'reason:', reason);
});
Promise.reject(new Error('This is an unhandled rejection'));
### 8. 小结
Node.js提供了强大的错误处理机制,包括内置的错误类型和自定义错误类型的能力。通过使用正确的错误处理模式,可以确保Node.js应用程序的健壮性和稳定性。无论是同步代码、异步回调、`Promise`或`async/await`,都应该考虑适当的错误处理策略,避免未处理的错误导致应用程序崩溃。