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 语句可以手动抛出异常。合理使用异常处理可以提高代码的可靠性和可维护性,特别是在处理用户输入、网络请求等可能导致错误的场景中。