#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
.