Бросать пользовательские исключения в Javascript. Какой стиль использовать?

Дуглас Крокфорд рекомендует сделать что-то вроде этого:

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 свойство в реализации Крокфорда, а затем изучить это вместо того, чтобы делать instanceof, Есть ли какое-то преимущество от одного?

2 ответа

Решение

Обратите внимание, что в то же время большинство сред JavaScripts предоставляют объект Error в качестве основы для исключений. Он уже позволяет вам определять сообщение, но также предоставляет полезное свойство стека для отслеживания контекста исключения. Вы можете создать свой собственный тип исключения, используя прототип наследования. Уже есть несколько обсуждений стекопотока (например, здесь), как это сделать правильно. Однако мне пришлось немного копать, пока я не нашел правильный и современный подход. Помните, что подход, предложенный в документации Mozilla (см. Выше), не нравится сообществу stackru. После долгих чтений я предложил такой подход для наследования от 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;

Я за второй, так как он более пригоден для повторного использования с точки зрения чистоты кода. Если быть точным, если я собираюсь выдать одно и то же исключение (даже один и тот же тип исключения с другим сообщением) в нескольких местах, мой код станет грязным (огромным) при первом подходе.

Другие вопросы по тегам