1. 错误的本质
当某些非期望的事情发生时程序就引发一个错误。如果错误没有被抛出或者报告给你的话,调试是非常困难的。所以,错误是开发者的朋友,而不是敌人。
2. 在 JavaScript 中抛出错误
throw new Error("Something bad happened.")
以这种方式抛出错误时,如果没有使用 try-catch 捕获的话,浏览器会直接显示这个错误的消息。
// 不好的写法
throw "message";
3. 抛出错误的好处
作者推荐在错误消息中包含函数名称,以及函数失败的原因。
function getDivs(element) {
if (element && element.getElementByTagName) {
return element.getElementByTagName("div");
} else {
throw new Error("getDivs(): Argument must be a DOM element.");
}
}
4. 何时抛出错误
过度地检查并不实际,而且影响性能。辨识代码中哪些部分在特定的情况下最有可能导致失败,并只在那些地方抛出错误。
// 好的写法
function addClass(element, className) {
if (!element || typeof element.className != "string") {
throw new Error("addClass(): First argument must be a DOM element.");
}
element.className += " " + className;
}
经验法则:
修复了一个很难调试的错误后,尝试增加一两个自定义错误。当再次发生错误时,这将有助于更容易地解决问题
编写代码多思考:“我希望(某些事情)不会发生,如果发生,我的代码会一团糟糕”。如果“某些事情”发生,就抛出一个错误
如果编写的代码别人也会使用,思考他们的使用方式,在特定的情况下抛出错误
5. try-catch 语句
try {
somethingThatMightCauseAnError();
} catch (ex) {
handleError(ex);
}
try {
somethingThatMightCauseAnError();
} catch (ex) {
handleError(ex);
} finally {
continueDoingOtherStuff();
}
6. 错误类型
ECMA-262 规范指出了 7 种错误类型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
使用 instanceof 可以在 catch 块中进行类型检查。
创建自定义错误类型,让它继承自 Error:
function MyError(message) {
this.message = message;
}
MyError.prototype = new Error();
throw new MyError("Hello World!");