24

Douglas Crockford 建议这样做:

throw {
    name: "System Error",
    message: "Something horrible happened."
};

但你也可以这样做:

function IllegalArgumentException(message) {
    this.message = message;
}

throw new IllegalArgumentException("Argument cannot be less than zero");

然后做:

try {
    //some code that generates exceptions
} catch(e) {    
    if(e instanceof IllegalArgumentException) {
        //handle this
    } else if(e instanceof SomeOtherTypeOfException) {
        //handle this
    }
}

我想你可以type在 Crockford 的实现中包含一个属性,然后检查它而不是做一个instanceof. 做一个与另一个相比有什么优势吗?

4

2 回答 2

26

请注意,同时大多数 JavaScript 环境都提供Error 对象作为异常的基础。它已经允许您定义消息,而且还提供了有用的堆栈属性来跟踪异常的上下文。您可以使用原型继承创建自己的异常类型。已经有几个stackoverflow讨论(例如:here),如何正确地做到这一点。但是,在找到正确且现代的方法之前,我不得不进行一些研究。请注意,stackoverflow 社区不喜欢 Mozilla 文档(见上文)中建议的方法。经过大量阅读后,我得出了从 Error.prototype 继承的方法:

function IllegalArgumentException(sMessage) {
    this.name = "IllegalArgumentException";
    this.message = sMessage;
    this.stack = (new Error()).stack;
}
IllegalArgumentException.prototype = Object.create(Error.prototype);
IllegalArgumentException.prototype.constructor = IllegalArgumentException;
于 2014-06-06T09:06:57.437 回答
4

我赞成第二个,因为它在代码纯度方面更具可重用性。准确地说,如果我要在几个地方抛出相同的异常(甚至是具有不同消息的相同异常类型),我的代码会在第一种方法中变得混乱(巨大)。

于 2012-10-25T21:46:08.560 回答