面试题答案
一键面试优化错误处理机制提升性能
- 缩小try - catch块范围
- 避免在大段代码外包裹单个
try - catch
块。例如,如果函数中有多个独立的操作,对每个可能出错的操作单独使用try - catch
。
优化为:function example() { try { // 操作1 let result1 = someFunctionThatMightThrow1(); // 操作2 let result2 = someFunctionThatMightThrow2(); //...其他操作 } catch (error) { // 处理错误 } }
function example() { let result1; try { result1 = someFunctionThatMightThrow1(); } catch (error) { // 处理操作1的错误 } let result2; try { result2 = someFunctionThatMightThrow2(); } catch (error) { // 处理操作2的错误 } //...后续处理 }
- 避免在大段代码外包裹单个
- 使用更具体的错误类型捕获
- 捕获特定类型的错误,而不是捕获所有错误。例如,如果某个操作可能抛出
TypeError
,就捕获TypeError
。
try { let num = JSON.parse('not a json'); } catch (error) { if (error instanceof SyntaxError) { // 处理JSON解析错误 } }
- 捕获特定类型的错误,而不是捕获所有错误。例如,如果某个操作可能抛出
- 利用Promise和async/await的错误处理特性
- 使用
Promise
时,可以通过.catch
统一处理错误,避免在then
回调中频繁使用try - catch
。
someAsyncFunction() .then(result => { // 处理结果 }) .catch(error => { // 处理错误 });
- 在
async
函数中,使用单个try - catch
捕获函数内所有异步操作的错误。
async function asyncExample() { try { let result1 = await someAsyncFunction1(); let result2 = await someAsyncFunction2(); } catch (error) { // 处理错误 } }
- 使用
利用日志记录和监控工具辅助错误排查与性能分析
- 日志记录
- 客户端日志:在浏览器环境中,可以使用
console.log
、console.error
等进行简单的日志记录。但为了更好的管理,可以使用第三方日志库,如log4js - client
。它可以设置不同的日志级别(如debug
、info
、warn
、error
),方便在开发和生产环境中灵活控制日志输出。
import log4js from 'log4js - client'; log4js.configure({ appenders: { myLogger: { type: 'console' } }, categories: { default: { appenders: ['myLogger'], level: 'debug' } } }); const logger = log4js.getLogger(); try { let num = JSON.parse('not a json'); } catch (error) { logger.error('JSON解析错误:', error); }
- 服务器端日志:在Node.js环境中,
winston
是常用的日志库。它支持多种日志输出方式(如文件、控制台),并且可以进行日志格式化。
const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transport.Console(), new winston.transport.File({ filename: 'error.log' }) ] }); try { throw new Error('服务器端错误'); } catch (error) { logger.error('捕获到错误:', error.message); }
- 客户端日志:在浏览器环境中,可以使用
- 监控工具
- 客户端监控:Google Analytics可以收集用户行为数据,包括页面加载时间、用户操作路径等。Sentry是一款强大的错误监控工具,它能捕获JavaScript错误,并提供详细的错误堆栈信息、发生错误的用户信息等。在客户端引入Sentry SDK,如:
<script src="https://browser.sentry-cdn.com/[版本号]/bundle.min.js"></script> <script> Sentry.init({ dsn: '你的DSN' }); </script>
- 服务器端监控:New Relic可以监控Node.js应用的性能,包括CPU使用率、内存使用情况、请求响应时间等。它能帮助定位性能瓶颈和错误发生的位置。安装New Relic Node.js代理后,在应用入口引入相关代码:
同时,结合require('newrelic'); // 应用代码
Node.js
内置的cluster
模块和process.memoryUsage()
等方法,也可以对服务器端进程的资源使用情况进行监控和分析。