面试题答案
一键面试JavaScript常见错误类型
- SyntaxError:语法错误,当JavaScript代码不符合语法规则时抛出。例如:
var a = ();
括号使用错误就会报此错误。 - ReferenceError:引用错误,当尝试引用一个不存在的变量时抛出。比如:
console.log(a);
,而变量a
未声明就会报该错误。 - TypeError:类型错误,当操作或访问的变量类型不匹配时抛出。例如:
var num = 1; num();
,数字类型不是函数却调用就会报此错误。 - RangeError:范围错误,当一个值超出有效范围时抛出。比如
new Array(-1)
,数组长度不能为负数就会报该错误。 - URIError:URI 错误,当使用全局URI处理函数(如
encodeURI()
、decodeURI()
等)时,传入的参数格式不正确就会抛出此错误。例如decodeURI('%')
,%
后面缺少字符。 - EvalError:已弃用,在非严格模式下,当
eval()
函数执行出错时抛出。例如eval('1+')
,表达式不完整。但在严格模式下,会抛出SyntaxError
。
自定义错误类型
在JavaScript中,可以通过继承 Error
类来自定义错误类型。示例如下:
class MyCustomError extends Error {
constructor(message) {
super(message);
this.name = 'MyCustomError';
}
}
try {
throw new MyCustomError('这是一个自定义错误');
} catch (error) {
if (error instanceof MyCustomError) {
console.log(`捕获到自定义错误: ${error.message}`);
} else {
console.log(`捕获到其他错误: ${error.message}`);
}
}
在上述代码中,我们定义了 MyCustomError
类继承自 Error
类,并重写了构造函数,设置了自定义的 name
属性。在 try - catch
块中,抛出并捕获自定义错误,根据 instanceof
判断错误类型并进行相应处理。
自定义错误类型在复杂业务场景中的优势
- 错误分类清晰:在复杂业务中,不同模块或功能可能产生多种不同类型的错误。自定义错误类型可以使错误分类更清晰,便于开发者快速定位和处理特定类型的错误。例如,在一个电商系统中,库存模块可能抛出
OutOfStockError
自定义错误,支付模块可能抛出PaymentFailedError
自定义错误,这样在捕获错误时可以根据不同的错误类型进行针对性处理。 - 错误信息更丰富:自定义错误类型可以在构造函数中添加更多的错误相关信息。比如,自定义
DatabaseQueryError
错误类型时,可以在构造函数中传入查询语句、错误代码等详细信息,方便开发者在排查问题时获取更多线索。 - 增强代码可读性和维护性:使用自定义错误类型可以使代码逻辑更清晰,当其他开发者阅读代码时,通过错误类型就能快速了解错误发生的大致原因和位置。例如,看到
FileUploadError
就能知道是文件上传过程中出现的问题,而不是看到一个笼统的Error
类型,难以判断错误来源。
适用场景
- 特定业务逻辑错误处理:在业务逻辑复杂且有特定错误场景的地方,如金融交易系统中处理交易失败、订单系统中处理订单状态异常等情况。
- 模块间错误传递:当不同模块之间存在交互,且每个模块需要抛出特定类型错误供其他模块处理时。例如,数据获取模块可能抛出
DataFetchError
给上层业务模块,业务模块根据这个自定义错误进行重试或提示用户相应信息。 - 错误追踪和调试:在大型项目中,为了更好地追踪和调试错误,自定义错误类型可以携带更多的上下文信息,方便开发人员快速定位和解决问题。例如,在日志记录中,自定义错误类型及其详细信息可以帮助运维人员更准确地了解系统故障。