这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
浏览器错误
当我们在浏览器中操作,浏览器都会给用户提供错误的机制,默认情况下,浏览器会隐藏错误信息。其中一个原因是因为除了开发者之外这些错误信息对别人没什么用,还有一个原因是因为网页在正常操作中报错的特性。
错误处理方式
第一种方法可以采用try/catch语句,这是JavaScript中一种处理错误的方式,类似于Java中处理错误方式,可能出错的代码我们都应该放到try块中,而处理错误的代码则放在catch块中,如下所示:
try {
// 可能会出现错误的代码
console.log('error code');
} catch (error) {
// 出错时要做什么
console.log('error', error);
}
当代码中在try出现错误时,代码就会立即退出执行,就会跳到catch块中,catch块此时接收到一个对象,这个对象包含发生错误的相关信息。与其他不同的是,即使catch块中不使用错误对象,也要为它定义名称。这种错误实际信息要根据浏览器不同而不同。但是至少包含保存错误消息的message属性。
其中try/catch语句中可选的finally子句始终运行。如果代码在try中执行弯沉通过后,就会去执行finally中的代码,如果出现错误并执行了catch块中的代码,则finally块中的代码执行。try和catch都不能阻止finally块执行,也包括return语句。
function testFinally(){
try {
return 'try';
} catch (error){
return 'error';
} finally {
return 'finally';
}
}
当finally块的存在会导致try块中的return语句被忽略,因此,无论什么情况下调用该函数都会返回finally,如果去掉finally子句,那么该函数就会返回try。所以我们需要注意一点,就是只要代码中包含了finally子句,try块或catch块中的return语句就会被忽略,所以我们在使用finally时一定要仔细确认代码的行为。
错误类型
代码执行过程中会发生各种类型的错误,每种类型都会对应一个错误发生时抛出的错误对象。Error是基类型,其他错误类型继承该类型。InternalError类型的错误会在底层 JavaScript 引擎抛出异常时由浏览器抛出。EvalError类型的错误会在使用eval()函数发生异常时抛出。RangeError在JavaScript中发生得不多。ReferenceError会在找不到对象时发生。TypeError在JavaScript中很常见,主要发生在变量不是预期类型,或者访问不存在的方法时。URIError只会在使用encodeURI()或decodeURI()但传入了格式错误的URI时发生。检查错误类型是以跨浏览器方式确定适当操作过程的最简单方法,因为message 属性中包含的错误消息因浏览器而异。当try/catch中发生错误时,浏览器会认为错误被处理了,因此就不会再出现前面提到的报告错误。try/catch语句最好用在自己无法控制的错误上。如果你明确知道自己的代码会发生某种错误,那么就不适合使用try/catch语句。