《编写可维护的 JavaScript》读书笔记第10章:抛出自定义错误

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!");

你可能感兴趣的:(JavaScript,error,catch,try,throw)