面试题答案
一键面试- 使用
async/await
结合try/catch
- 在异步函数中,
async/await
能让异步代码看起来更像同步代码。通过try/catch
块可以捕获在await
操作时抛出的错误。例如:
async function asyncFunction() { try { const result = await someAsyncOperation(); // 处理结果 } catch (error) { // 捕获并处理异步操作中的错误 console.error('异步操作错误:', error); } }
- 在异步函数中,
- 全局错误处理
- 在Node.js应用中,可以使用
process.on('uncaughtException')
和process.on('unhandledRejection')
来捕获未处理的异常和未处理的Promise拒绝。 - 在浏览器环境中,可以使用
window.onerror
来捕获全局的JavaScript错误,对于异步操作中的错误,它也能起到一定的捕获作用。例如:
// Node.js全局未处理异常捕获 process.on('uncaughtException', (err) => { console.error('未捕获的异常:', err); // 可以在这里添加适当的错误处理逻辑,如记录日志,优雅关闭应用等 }); // Node.js全局未处理Promise拒绝捕获 process.on('unhandledRejection', (reason, promise) => { console.error('未处理的Promise拒绝:', reason, promise); }); // 浏览器全局错误捕获 window.onerror = function (message, source, lineno, colno, error) { console.error('全局错误:', message, source, lineno, colno, error); return true; // 阻止默认的错误处理行为 };
- 在Node.js应用中,可以使用
- 错误边界(Error Boundaries)(适用于React应用)
- 如果是在React应用中,错误边界是一种React组件,它可以捕获并处理其子组件树中的JavaScript错误,记录这些错误,并展示备用UI,而不会使整个应用崩溃。例如:
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, errorInfo) { // 记录错误,例如发送到日志服务器 console.log('组件捕获到错误:', error, errorInfo); this.setState({ hasError: true }); } render() { if (this.state.hasError) { // 返回备用UI return <div>发生错误,正在处理...</div>; } return this.props.children; } }
- 统一的错误处理中间件(适用于Express等框架)
- 在基于Express的Web应用中,可以使用中间件来统一处理异步错误。例如:
const express = require('express'); const app = express(); app.use((err, req, res, next) => { // 统一处理所有异步路由处理函数中抛出的错误 console.error('路由异步错误:', err); res.status(500).send('服务器内部错误'); });
- 封装异步操作并提供统一的错误处理
- 将常用的异步操作封装成函数,并在这些函数内部统一处理错误。例如:
function makeAsyncRequest(url) { return new Promise((resolve, reject) => { // 模拟异步请求 setTimeout(() => { const success = Math.random() > 0.5; if (success) { resolve('成功'); } else { reject(new Error('请求失败')); } }, 1000); }); } async function main() { try { const result = await makeAsyncRequest('/api/data'); console.log(result); } catch (error) { console.error('统一错误处理:', error); } } main();
- 使用日志记录错误
- 在捕获到异步错误时,使用日志记录工具(如
winston
、pino
等)将错误信息记录下来,包括错误堆栈、错误发生的上下文等。这样在排查问题时,可以更方便地定位错误源头。例如,使用winston
记录错误:
const winston = require('winston'); const logger = winston.createLogger({ level: 'error', format: winston.format.json(), transports: [ new winston.transport.Console(), new winston.transport.File({ filename: 'error.log' }) ] }); async function asyncFunction() { try { const result = await someAsyncOperation(); } catch (error) { logger.error('异步错误', { error, stack: error.stack }); } }
- 在捕获到异步错误时,使用日志记录工具(如