JavaScript的try...catch仅捕获同步执行异常,不处理异步错误、语法错误、资源加载失败及Promise拒绝;需在调用处包裹且await异步操作,catch参数应命名避免覆盖Error,finally中避免return或throw。
JavaScript 的
不是用来“兜底所有错误”的万能开关,它只捕获**同步执行中抛出的异常**,对异步错误、语法错误、资源加载失败(如
404)、Promise 拒绝(
)默认不生效。
同步代码异常必须用
包裹才被捕获
很多人以为只要写了
,函数里任何报错都会进
——其实不然。只有在
块内**实际执行时抛出的异常**才会被捕获。函数定义本身不出错,调用时才可能出错。
→ 放在
内会进
→ 放在
内会进
(未调用)→ 不会触发任何异常
(调用后)→ 才会抛
,且仅当它在
块中执行时才被捕获
参数不是必须叫
,但必须存在
ES2019+ 允许
省略参数(即
),但此时你完全拿不到错误细节,基本等于“假装没发生”。真实项目中几乎不用。
推荐写法:
注意:
是运行时绑定的局部变量,不是全局
构造函数
不要写成
——这会覆盖内置
,后续
可能报错
错误对象通常有
、
、
属性,
对定位最有用
Promises 和 async/await 的错误不能靠外层
自动捕获
这是最常踩的坑:把
或
请求直接丢进
,却不
,结果
完全不触发。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
❌ 错误写法:
→
返回 Promise,不 await 就不算“同步抛错”
✅ 正确写法(async/await):
✅ 或 Promise 链:
注意:
本身只在网络失败时 reject;HTTP 4xx/5xx 不会 reject,需手动检查
总是执行,但别在里面 throw 新错误
适合做清理工作(如关闭 loading、释放锁、重置状态),但它会覆盖
或
中的
或
。
如果
中
,
中
→ 整个函数返回
如果
中
,
中又
→ 外部只能看到
,
被吞掉
所以
里尽量只做无副作用的操作,避免
或
真正难的不是语法,而是判断该在哪一层加
:太深,业务逻辑被异常处理淹没;太浅,错误信息丢失上下文。多数时候,错误处理应该靠近具体操作(比如解析 JSON、调用某个 SDK 方法),而不是堆在入口函数里统一包一层。
try...catchscriptrejecttry...catchtry...catchcatchtryJSON.parse('{"name":}') // SyntaxErrortrycatchundefined.foo()trycatchfunction bad() { return x.y; }bad()ReferenceErrortrycatcherrcatchcatch{}catch (error) { console.error(error.message); }errorErrorcatch (Error)Errorthrow new Error()messagenamestackstacktry...catchfetchaxiostryawaitcatchtry { fetch('/api'); } catch (e) { ... }fetchasync function f() { try { const r = await fetch('/api'); } catch (e) { ... } }fetch('/api').catch(e => { ... })fetchresponse.okfinallyfinallytrycatchreturnthrowtryreturn 1finallyreturn 22catchthrow new Error('a')finallythrow new Error('b')'b''a'finallyreturnthrowtry...catch