Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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