Ловля “NullPointerExceptions” в JavaScript

Я пишу довольно мало кода в Prototype.js, который возвращает пустой указатель, если DOM-идентификатор не был найден.

$("someId").show();

Если someId не существует, метод назовут на пустом указателе, который останавливает всю программу, в действительности отключая все эффекты JS после ошибки. Я мог просто проверить на пустой указатель прежде, чем выполнить такой оператор, но это становится утомительным.

Я хотел бы поймать исключение, но я не уверен, который. MDC перечисляет следующие ошибочные типы Сценария ECMA, но на первом взгляде ни один из них, кажется, не то, что я хочу:

* Error
* EvalError
* RangeError
* ReferenceError
* SyntaxError
* TypeError
* URIError
* DOMException
* EventException
* RangeException

Кроме того, браузеры имеют объединенный способ иметь дело с вызовом метода на пустом указателе?

6
задан Leonard Ehrenfried 27 April 2010 в 12:31
поделиться

4 ответа

Я не верю, что можно найти единство. Chrome выдает ошибку TypeError, но IE выдает ошибку, поэтому вам, вероятно, придется уловить все и сделать серьезные предположения. Лучше сначала проверить значение null.

var element = $('someId');
if (element) {
    element.show();
    // whatever else...
}

Если element.show () - единственное, для чего он вам нужен, то его, очевидно, можно написать намного короче, но в большинстве случаев это было бы целесообразно.

2
ответ дан 17 December 2019 в 07:02
поделиться

Правильный способ справиться с этим - проверить значение null перед тем, как что-то делать с объектом. Есть несколько сокращенных способов сделать это, самый короткий (как писал Алекс К.)

$("someId") && $("someId").show();

, но мне кажется, что это труднее читать.

Чтобы напрямую ответить на ваш вопрос, вы можете сделать

try { $('someId').show(); } catch (e) {} 

, но это кажется дилетантским. Вы должны программировать явно, потому что позже кто-то еще не узнает, почему вы написали этот странный код. Первый пример немного непрозрачен, но по крайней мере сначала содержит нулевой тест и не скрывает ошибок в методе show () .

Между прочим, если бы вы использовали JQuery вместо Prototype, этот код работал бы без ошибок, даже если не было объекта с идентификатором 'someId':

$('#someId').show()

Это потому, что функция $ () в JQuery возвращает коллекцию, которая может быть пусто, но никогда не бывает нулевым.

1
ответ дан 17 December 2019 в 07:02
поделиться

Если вы собираетесь на цепь. show () на $ ("someId") , затем сначала проверьте его результат.

if ($("someId"))
   $("someId").show();

or

$("someId") && $("someId").show();

or

if (someVar = $("someId"))
   someVar.show();

Если по какой-то причине вам действительно нужно их идентифицировать, вы можете обернуть $ () и выдать собственное исключение:

function NullReferenceException(id) {this.id = id}

function $my(id) {
    var el = $(id);
    if (!el)
        throw new NullReferenceException(id);
    return el
}

try {
    $my("iDontExistId").show();
} catch (e) {
    if (e instanceof NullReferenceException)
        alert(e.id + " doesn't exist");
}
1
ответ дан 17 December 2019 в 07:02
поделиться

Просто игнорируйте, какое это исключение ...

try
{
    null.hey()
}
catch(e)
{
    //handle it here
}
0
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

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