JavaScript中的错误处理:try/catch与Node.js高级技术

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript 中的错误处理:try/catch 及其他



错误处理是 JavaScript 开发中的关键任务之一,尤其是在 Node.js 环境中,服务器端应用的稳定性直接影响用户体验。未处理的异常可能导致整个进程崩溃和数据丢失。本文将不仅介绍经典的 try/catch 块,还将深入探讨高级技术:finally 的使用、自定义错误类型的创建、异步错误处理以及 Node.js 的最佳实践。



1. 基础:try、catch 和 finally



try/catch 块是捕获同步异常的基本机制。如果 try 块中发生错误,执行会立即转移到 catch 块。finally 块始终执行——无论是否发生错误。这对于释放资源(关闭文件、连接)非常方便。



const fs = require('fs');

function readConfig(path) { try { const data = fs.readFileSync(path, 'utf8'); console.log('配置已加载'); return JSON.parse(data); } catch (err) { console.error('读取配置时出错:', err.message); return null; } finally { console.log('读取尝试已完成'); }}

const config = readConfig('./config.json');console.log(config); // 出错时为 null


重要提示:catch 仅捕获 try 块中发生的错误。catch 或 finally 块中的错误仍将保持未处理状态。



2. JavaScript 和 Node.js 中的错误类型



JavaScript 中有几种内置的错误类型,每种都继承自 Error:



  • SyntaxError — 代码解析时的语法错误。
  • ReferenceError — 引用不存在的变量。
  • TypeError — 无效的数据类型(例如,调用非函数)。
  • RangeError — 值超出允许范围。
  • URIError — 使用 URI(encodeURI/decodeURI)时出错。


在 Node.js 中,增加了 AssertionError(来自 assert 模块)和系统错误(EACCES、ENOENT 等,来自 fs 模块),这些错误在 code 属性中包含错误代码。



try {  require('fs').readFileSync('/nonexistent');} catch (err) {  if (err.code === 'ENOENT') {    console.log('文件未找到');  } else {    console.log('其他错误:', err.message);  }}


3. 创建自定义错误



为了更精确地控制错误处理逻辑,建议创建扩展 Error 的自定义错误类。这有助于区分业务逻辑错误和系统故障。



class ValidationError extends Error {  constructor(message, field) {    super(message);    this.name = 'ValidationError';    this.field = field;  }}

class DatabaseError extends Error { constructor(message, query) { super(message); this.name = 'DatabaseError'; this.query = query; }}

function saveUser(user) { if (!user.email) { throw new ValidationError('Email 是必填项', 'email'); } // 模拟数据库错误 throw new DatabaseError('连接超时', 'INSERT INTO users');}

try { saveUser({ name: '伊万' });} catch (err) { if (err instanceof ValidationError) { console.log(`字段 ${err.field}:${err.message}`); } else if (err instanceof DatabaseError) { console.error(`数据库错误 (${err.query}):${err.message}`); // 重试或记录日志 } else { console.error('未知错误:', err); }}


使用 instanceof 可以构建处理程序链,而无需检查字符串代码。

博客

书籍推荐