怎样处理javascript错误_try…catch语句如何使用【教程】

11次阅读

trycatch仅对同步错误有效,异步操作需用await+async或.catch(),全局错误和未捕获promise拒绝须监听window.onError和unhandledrejection事件

怎样处理javascript错误_try…catch语句如何使用【教程】

直接用 try...catch 捕获同步错误没问题,但对异步操作、Promise 拒绝、全局错误或语法错误基本无效——得配合其他机制一起用。

同步代码错误必须用 try...catch 包裹

javaScript 中只有显式被 try 块包裹的同步执行代码,抛出的错误才能被 catch 捕获。函数调用链中任何一层没包住,错误就直接冒泡到全局。

  • try 块里不能只写函数声明,得是实际执行的表达式(比如 parsejsON(str) 而非 function parsejson(){...}
  • catch 参数是错误对象,建议命名为 errerror,别用 e——调试时 ide 提示不友好
  • 不要空 catch:哪怕只是 console.error(err),也比吞掉错误强

Promise 拒绝不能靠 try...catch 自动捕获

下面这段代码看似用了 try...catch,但 fetch 失败时根本进不了 catch 块:

try {   fetch('/api/data').then(r => r.json()); } catch (err) {   console.log('这里不会执行'); }

正确做法是:要么链式调用 .catch(),要么用 await 配合 try...catch(前提是函数声明为 async):

立即学习Java免费学习笔记(深入)”;

  • 链式:fetch(...).then(...).catch(err => {...})
  • async/await:try { const data = await fetch(...).then(r => r.json()); } catch (err) {...}
  • 注意:await 只解包 Promise 的 rejection,不处理网络超时等底层异常,仍需检查 response.okresponse.status

全局错误和未捕获 Promise 拒绝要单独监听

try...catch 对以下两类错误完全无感:

  • 顶层语法错误(如 const a = ;),脚本加载阶段就报错,根本跑不到 try
  • 未被 .catch()try...await...catch 处理的 Promise rejection(会触发 unhandledrejection 事件)

补救方式:

  • 监听 window.onerror 捕获同步运行时错误(含脚本加载错误)
  • 监听 window.addEventListener('unhandledrejection', e => {...}) 捕获漏网的 Promise 拒绝
  • 这两处适合做错误上报,但别用来替代局部 try...catch——定位太粗,无法知道具体哪行出问题

真正难处理的不是怎么写 try...catch,而是判断该在哪一层加、加完之后要不要继续 throw、以及如何区分“可恢复错误”和“该崩就崩”的致命错误。这些没法靠语法解决,得看业务上下文。

text=ZqhQzanResources