JavaScript 异常处理
在 JavaScript 中,异常处理是一种处理运行时错误(异常)的重要机制,它能帮助我们优雅地处理可能发生的错误,避免程序因错误而崩溃或产生意外行为。
1、try-catch-finally 语句
JavaScript 中主要通过 try、catch 和 finally 三个关键字来进行异常处理:
try: 包含可能会抛出异常的代码块。
catch: 捕获并处理 try 代码块中抛出的异常。
finally: 无论是否抛出异常,都会执行的代码块(可选)。
try {
// 可能会抛出异常的代码
let result = 10 / 0; // 这里会抛出一个除以零的异常
console.log(result); // 这行代码不会被执行
} catch (error) {
// 处理异常的代码
console.error('An error occurred:', error.message);
} finally {
// 不管是否抛出异常,都会执行的代码
console.log('Execution completed.');
}2. throw 语句
throw 语句用于手动抛出异常。可以抛出任何值,通常是一个 Error 对象或继承自 Error 的自定义异常对象。
function validateNumber(x) {
if (typeof x !== 'number') {
throw new Error('Invalid input: not a number');
}
return x;
}
try {
let result = validateNumber('abc');
console.log('Validation passed:', result);
} catch (error) {
console.error('Validation failed:', error.message);
}3. 自定义异常对象
除了使用 Error 对象外,还可以创建自定义的异常对象,通过继承 Error 类来扩展其功能。
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
function processData(data) {
if (!data) {
throw new CustomError('Data is required');
}
// 处理数据
}
try {
processData(null);
} catch (error) {
console.error(error.name + ': ' + error.message);
}
4. 全局异常处理
可以使用 window.onerror 或 window.addEventListener('error', handler) 来捕获全局的未捕获异常,通常用于记录错误或发送错误报告。
window.onerror = function(message, source, lineno, colno, error) {
console.error('Error:', message, 'at', source, 'line', lineno, 'column', colno);
};
// 或者使用事件监听器
window.addEventListener('error', function(event) {
console.error('Uncaught error:', event.error.message);
});5. 异步异常处理
对于异步操作中的异常处理,可以使用 try-catch 包裹 async 函数的调用,或者在 Promise 的 catch 方法中处理异常。
async function fetchData() {
try {
let response = await fetch('https://nonexistent-api.example.com');
let data = await response.json();
console.log('Data fetched:', data);
} catch (error) {
console.error('Fetch operation failed:', error.message);
}
}
fetchData();总结
异常处理是编写健壮 JavaScript 代码的重要组成部分。通过 try-catch-finally 语句可以捕获和处理异常,throw 语句可以手动抛出异常。合理使用异常处理可以提高代码的可靠性和可维护性,特别是在处理用户输入、网络请求等可能导致错误的场景中。