MyError extending не работает по назначению

'use strict';

class ExtendableError extends Error {
    constructor(message) {
        super();
        this.message = message;
        this.stack = (new Error()).stack;
        this.name = this.constructor.name;
    }
}

class MyError extends ExtendableError {
    constructor(message) {
        super(message);
    }
}

try {
    throw new Error('Oops!');
} catch (err) {
    console.log(err);
}

try {
    throw new MyError('Oops!');
} catch (err) {
    console.log(err);
}

Первая ошибка выплевывает:

Error: Oops!
    at Object.<anonymous> (/home/karl/dev/node/project/exceptions.js:19:11)

Второй:

{ Error
    at MyError.ExtendableError (/home/karl/dev/node/project/exceptions.js:7:23)
...

Я ожидал, что второй заявит MyError: Oops!.

2 ответа

  1. Вы просто забыли добавить это.имя конструктора

    ‘use strict’;

    class ExtendableError extends Error {
        constructor(message) {
            super();
            this.message = message;
            this.stack = (new Error()).stack;
            this.name = this.constructor.name;
        }
    }
    
    class MyError extends ExtendableError {
        constructor(message) {
            super(message);
            this.name = "MyError" //Here you put the name
        }
    }
    
    try {
        throw new Error('Oops!');
    } catch (err) {
        console.log(err);
    }
    
    try {
        throw new MyError('Oops!');
    } catch (err) {
        console.log(err);
    }
    
  2. Ваше исключение кулака генерируется, обращая внимание на сообщение об ошибке, в строке 19, это, как раз, где вы вызываете свою новую ошибку броска.

    Второй, однако, находится в строке 7, это означает, что он вызывается из

    this.stack = (new Error()).stack; 
    

    И подразумевает, что, когда вы вызываете throw new MyError, внутреннее исключение создается в этой строке.

    Вы должны проверить, почему это исключение успешно и попытаться исправить его, прежде чем ваша система работает должным образом.

    Возможно, вам стоит использовать свой супер.стек вместо создания нового объекта ошибки в конструкторе ExtendableError