Как создавать, проектировать и создавать встроенные объекты ошибок

#javascript #firebug

#javascript #firebug

Вопрос:

Обновить


[Переписать вопрос, чтобы сосредоточиться на проблеме, которую я пытаюсь понять.]

Есть ли в JavaScript средство для создания исключений, которые уведомляют номер строки, в которой возникает проблема? Аналогично отладчику C #, если в строке 50 выдается ошибка, я попаду в строку 50.

Например, в соответствии с MDN EvalError представляет собой ошибку с eval() . Итак, допустим, у меня есть функция, которая использует eval() . Я хочу использовать конкретную ошибку, которая является репрезентативной для рассматриваемой проблемы, EvalError :

 //As written here the error implies there is a problem on this line.  See Firebug console window
var evalErra = new EvalError('required element missing from evaluation');

var stringFunc = "a=2;y=3;document.write(x*y);";

EvalString(stringFunc);

function EvalString(stringObject) {
    //Some arbitrary check, for arguments sake let's say checking for 'x' makes this eval() valid.
    if(stringObject.indexOf('x') !== -1) {
        throw evalErra;
        //throw 'required element missing from evaluation';//This way offers no line number
    }
    eval(stringFunc);//The problem really lies in the context of this function.
}
 

Если я все делаю неправильно, то, пожалуйста, скажите мне, как мне следует подходить к такого рода проблемам.

Ответ №1:

Когда вы выдаете ошибку, выполнение текущего кода останавливается, и JS проделывает обратный путь вверх по дереву выполнения, пока не найдет a, catch () который обрабатывает определенный тип выдаваемой ошибки, или добирается до вершины дерева, вызывая ошибку «необработанное исключение»: вы выдал ошибку, и ее никто не поймал, а теперь чье-то окно разбилось.

 try {
   if (true) {
      throw 'yup'
   }
} catch (e) { // catches all errors
   ... handle the error
}
 

Комментарии:

1. Почему я вижу разницу между неперехваченной строковой буквенной ошибкой и неперехваченной типизированной ошибкой EvalError?

2. ты можешь бросать все, что захочешь. В случае «да» вы выбрасываете жестко закодированную строку, которая в принципе бессмысленна. Это могло throw 'woah, true was not true' бы быть что-то более полезное. Что касается ошибки EvalError, вы выбрасываете весь объект целиком, и единственный раз, когда этот объект использовался / упоминался, — это строка, в которой он создается, так что именно там сообщается об ошибке.

3. Обновленный вопрос, чтобы попытаться сузить область до проблемы, которую я хочу решить.

4. Попробуйте throw new EvalError('required element missing') вместо этого. EvalError, похоже, вставляет номер строки, в которой он был создан, а это значит, что когда вы его выбросите, он будет указывать не на то место. Но в противном случае он должен быть автоматически сгенерирован при сбое eval. так try { eval(...) } catch (EvalError) { ... }

Ответ №2:

При выполнении обработки ошибок вы хотите выполнить следующие действия

throw new Error("message");

Затем, если вы когда-нибудь справитесь с этой ошибкой, посмотрите err.stack (firefox / opera / chrome) или err.line (Safari) или err.IE_Y_U_NO_SHOW_ME_ERROR_LINE_NUMBER (IE), чтобы найти номер строки.

Если вы хотите , вы можете создать подкласс Error .