在JavaScript中捕获“NullPointerExceptions”

时间:2010-04-27 12:31:15

标签: javascript error-handling

我在Prototype.js中编写了相当多的代码,如果找不到DOM-id,则返回null。

$("someId").show();

如果someId不存在,则会在null上调用一个方法,该方法会暂停整个程序,实际上会在错误后禁用所有JS效果。我可以在执行这样的声明之前检查null,但这很累。

我想抓住一个例外,但我不确定它是哪一个。 MDC列出了以下ECMA Script错误类型,但乍一看似乎没有一个是我想要的:

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

另外,浏览器是否有统一的方法来处理null的方法调用?

4 个答案:

答案 0 :(得分:2)

我不相信有统一性。 Chrome会抛出一个TypeError,但IE会抛出一个错误,所以你可能不得不抓住所有内容并做出严格的假设。最好先检查是否为空。

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

如果element.show()是你唯一需要它的东西,那么它显然可以写得更短,但在大多数情况下这是合适的。

答案 1 :(得分:1)

如果您要在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");
}

答案 2 :(得分:1)

处理此问题的正确方法是在对对象执行操作之前检查null。有几种简便的方法可以做到这一点,最短的是(正如Alex K所写)

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

但在我看来这更难阅读。

直接回答您的问题,您可以

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

但这看起来很业余。您应该明确编程,因为稍后其他人不会知道您编写奇怪代码的原因。第一个示例略微不透明,但至少首先包含null测试,并且不会隐藏show()方法中的错误。

顺便说一句,如果您使用的是JQuery而不是Prototype,即使没有id为'someId'的对象,此代码也可以正常运行:

$('#someId').show()

这是因为JQuery中的$()函数返回的集合可能为空但从不为null。

答案 3 :(得分:0)

只要忽略它是哪个例外......

try
{
    null.hey()
}
catch(e)
{
    //handle it here
}