javascript class中异常处理统一使用try...catch:实例方法中捕获同步错误,async方法中需await确保捕获promise拒绝,构造函数宜避免异步操作,推荐自定义错误类型和封装通用错误处理逻辑。

在 JavaScript class 中,类方法里捕获并处理异常和普通函数一样,使用 try...catch 语句块即可。关键是要把可能抛出错误的代码放在 try 块中,把错误处理逻辑写在 catch 块里。
在实例方法中捕获异常
这是最常见的情况:当调用某个方法时,内部执行异步操作、JSON 解析、DOM 操作等可能失败的操作,需要及时拦截错误。
- 直接在方法体内包裹
try...catch -
catch参数(如err)会接收到被抛出的错误对象,可访问err.message、err.name等属性 - 可以记录日志、重试、降级处理,或重新抛出(
throw err)交由上层处理
示例:
class UserService {
fetchUser(id) {
try {
if (!id) throw new Error('ID is required');
const response = fetch(`/api/users/${id}`);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
} catch (err) {
console.error('Failed to fetch user:', err.message);
return null; // 或抛出自定义错误:throw new UserFetchError(err.message);
}
}
}
在异步方法中正确捕获 Promise 错误
如果方法返回 Promise(比如用了 async/await),try...catch 同样适用,但要注意:它只捕获 await 表达式中被 reject 的 Promise,不捕获未 await 的 Promise 错误。
- 所有异步操作必须用
await,否则catch不会生效 - 避免在
async方法中漏掉await,否则错误会变成未处理的 Promise rejection - 可配合
finally做清理工作(如关闭加载状态)
示例:
class ApiClient {
async getData(url) {
try {
const res = await fetch(url); // ✅ 正确 await
if (!res.ok) throw new Error(`Network error: ${res.status}`);
return await res.json();
} catch (err) {
console.warn('API request failed:', err.message);
throw new Error(`ApiClient error: ${err.message}`);
}
}
}
在构造函数中处理初始化异常
构造函数也可以用 try...catch,但要注意:如果构造函数抛出错误,实例不会被创建,所以通常建议把易错逻辑延迟到普通方法中。
- 若必须在 constructor 中校验(如必填参数、配置合法性),可直接
throw,让调用方处理 - 避免在 constructor 中做异步初始化;如需,应改为工厂函数或提供
init()方法 - 错误类型建议自定义(如
new InvalidConfigError()),便于区分和捕获
统一错误处理策略(可选进阶)
对于大型类,可封装通用错误处理逻辑,减少重复代码:
- 抽离
handleError(err, context)工具方法 - 用装饰器模式(需 Babel 或 TypeScript 支持)自动包裹方法
- 结合事件系统(如
this.emit('error', err))向外通知错误
例如轻量封装:
class SafeService {
safeRun(fn, fallback = null) {
try {
return fn();
} catch (err) {
this.logError(err);
return fallback;
}
}
logError(err) {
console.error(`[${this.constructor.name}]`, err);
}
doSomething() {
return this.safeRun(() => JSON.parse('{invalid}'), {});
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











