title: JavaScript高级程序设计第四版学习–第二十一章
date: 2021-5-30 20:02:06
author: Xilong88
tags: JavaScript
本章内容:
理解浏览器错误报告
处理错误
调试JavaScript代码
可能出现的面试题:
1.try,catch,finally的基本使用
2.JavaScript错误类型有哪些?它们一般在什么情况下发生?
3.error事件的回调有哪些参数?
4.什么是重大错误,什么是非重大错误?
5.console对象有哪些方法?
知识点:
1.try /catch 语句
try {
// 可能出错的代码
} catch (error) {
// 出错时要做什么
}
如果try 块中有代码发生错误,代码会立即退出执行,并跳到catch 块中。
finally 子句
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
无论如何,finally都是会执行的
只要代码中包含了finally 子句,try 块或catch 块中的return 语句就会被忽略,理解这一点很重要。在使用finally 时一定要仔细确认代码的行为。
2.错误类型
Error
InternalError
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
InternalError 类型的错误会在底层JavaScript引擎抛出异常时由浏览器抛出。
比如栈溢出
EvalError 类型的错误会在使用eval() 函数发生异常时抛出。
也就是只要错误的使用了eval()就会报错
基本上,只要不把eval() 当成函数调用就会报告该错误:
new eval(); // 抛出EvalError
eval = foo; // 抛出EvalError
RangeError 错误会在数值越界时抛出。
let items1 = new Array(-20); // 抛出RangeError
let items2 = new Array(Number.MAX_VALUE); // 抛出RangeError
ReferenceError 会在找不到对象时发生。
let obj = x; // 在x没有声明时会抛出ReferenceError
SyntaxError 是语法错误。
eval("a ++ b"); // 抛出SyntaxError
URIError是URI非法的错误
使用encodeURI()或decodeURI() 但传入了格式错误的URI时发生。
3.抛出错误
throw 操作符必须有一个值,但值的类型不限。
throw 12345;
throw "Hello world!";
throw true;
throw { name: "JavaScript" };
使用throw 操作符时,代码立即停止执行,除非try /catch 语句捕获了抛出的值。
也可以抛出一个错误类型
throw new Error("Something bad happened.");
除了默认类型,其他类型也OK
throw new SyntaxError("I don't like your syntax.");
throw new InternalError("I can't do that, Dave.");
throw new TypeError("What type of variable do you take me for?");
throw new RangeError("Sorry, you just don't have the range.");
throw new EvalError("That doesn't evaluate.");
throw new URIError("Uri, is that you?");
throw new ReferenceError("You didn't cite your references properly.");
也可以自定义一个类型来继承Error
class CustomError extends Error {
constructor(message) {
super(message);
this.name = "CustomError";
this.message = message;
}
}
throw new CustomError("My message");
4.error 事件
任何没有被try /catch 语句处理的错误都会在window 对象上触发error 事件。
在onerror 事件处理程序中,任何浏览器都不会传入event 对象。相反,会传入3个参数:错误消息、发生错误的URL和行号。
window.onerror = (message, url, line) => {
console.log(message);
};
可以返回false 来阻止浏览器默认报告错误的行
为,如下所示:
window.onerror = (message, url, line) => {
console.log(message);
return false;
};
5.重大与非重大错误
具有以下一个或多个特性的错误属于非重大错误:
不会影响用户的主要任务;
只会影响页面中某个部分;
可以恢复;
重复操作可能成功。
重大错误具备如下特性:
应用程序绝对无法继续运行;
错误严重影响了用户的主要目标;
会导致其他错误发生。
6.调试技术
浏览器都支持通过console 对象直接把JavaScript消息写入控制台,这个对象包含如下方法。
error(message ) :在控制台中记录错误消息。
info(message ) :在控制台中记录信息性内容。
log(message ) :在控制台记录常规消息。
warn(message ) :在控制台中记录警告消息。