Что хороший путь состоит в том, чтобы расширить Ошибку в JavaScript?

Я хочу бросить некоторые вещи в свой код JS, и я хочу, чтобы они были instanceof Ошибкой, но я также хочу сделать, чтобы они были чем-то еще.

В Python, обычно, можно было бы разделить Исключение на подклассы.

Что соответствующая вещь состоит в том, чтобы сделать в JS?

339
задан Josh Gibson 18 April 2011 в 14:56
поделиться

2 ответа

Ответ Crescent Fresh, получивший большое количество голосов, вводит в заблуждение. Хотя его предупреждения недействительны, есть другие ограничения, которые он не устраняет.

Во-первых, аргументация в параграфе «Предостережения» Полумесяца не имеет смысла. Объяснение подразумевает, что кодирование «связки if (error instanceof MyError) else ...» как-то обременительно или многословно по сравнению с несколькими операторами catch. Несколько операторов instanceof в одном блоке catch столь же лаконичны, как и несколько операторов catch - чистый и лаконичный код без каких-либо уловок. Это отличный способ имитировать отличную обработку ошибок Java, специфичную для бросаемых подтипов.

WRT "появляется сообщение, что свойство подкласса не установлено", это не тот случай, если вы используете правильно сконструированный подкласс Error. Чтобы создать собственный подкласс ErrorX Error, просто скопируйте блок кода, начинающийся с «var MyError =», изменив одно слово «MyError» на «ErrorX». (Если вы хотите добавить собственные методы в свой подкласс, следуйте образцу текста).

Реальное и существенное ограничение подкласса ошибок JavaScript заключается в том, что для реализаций JavaScript или отладчиков, которые отслеживают и сообщают о трассировке стека и месте создания экземпляра, например FireFox, местоположение в вашей собственной реализации подкласса Error будет записано как создание экземпляра. точка класса, тогда как если бы вы использовали прямую ошибку, это было бы место, где вы запускали «новую ошибку (...)»). Пользователи IE, вероятно, никогда не заметят, но пользователи Fire Bug на FF увидят бесполезные значения имени файла и номера строки, сообщаемые вместе с этими ошибками, и им придется развернуть трассировку стека до элемента № 1, чтобы найти реальное место создания экземпляра.

18
ответ дан 23 November 2019 в 00:37
поделиться

В приведенном выше примере Error. apply (также Error.call) ничего не делает для меня (Firefox 3.6/Chrome 5). Я использую следующее обходное решение:

function MyError(message, fileName, lineNumber) {
    var err = new Error();

    if (err.stack) {
        // remove one stack level:
        if (typeof(Components) != 'undefined') {
            // Mozilla:
            this.stack = err.stack.substring(err.stack.indexOf('\n')+1);
        }
        else if (typeof(chrome) != 'undefined' || typeof(process) != 'undefined') {
            // Google Chrome/Node.js:
            this.stack = err.stack.replace(/\n[^\n]*/,'');
        }
        else {
            this.stack = err.stack;
        }
    }
    this.message    = message    === undefined ? err.message    : message;
    this.fileName   = fileName   === undefined ? err.fileName   : fileName;
    this.lineNumber = lineNumber === undefined ? err.lineNumber : lineNumber;
}

MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
MyError.prototype.name = 'MyError';
8
ответ дан 23 November 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: