【问题标题】:Catching "NullPointerExceptions" in JavaScript在 JavaScript 中捕获“NullPointerExceptions”
【发布时间】:2010-04-27 12:31:14
【问题描述】:

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

$("someId").show();

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

我想捕捉一个异常,但我不确定它是哪一个。 MDC 列出了以下 ECMA 脚本错误类型,但乍一看似乎都不是我想要的:

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

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

【问题讨论】:

  • 我可以在执行这样的语句之前检查null,但这很累。 嗯?你是不是开发者?编写带有检查的健壮代码是一种正常且良好的做法。
  • 好点,但反复嵌套的 if 子句使我的代码真的不可读。我应该这么说而不是“累”。
  • 接受答案,如果它适合你

标签: javascript error-handling


【解决方案1】:

我不相信可以找到统一性。 Chrome 会抛出 TypeError,但 IE 会抛出 Error,因此您可能必须捕获所有内容并做出严格的假设。最好先检查 null。

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

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

【讨论】:

    【解决方案2】:

    处理这个问题的正确方法是在对对象做某事之前检查 null。有几种速记方法可以做到这一点,最短的方法是(如 Alex K)所写

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

    但这在我看来更难阅读。

    要直接回答您的问题,您可以这样做

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

    但这似乎很业余。您应该明确编程,因为稍后其他人将不知道您为什么要编写那个奇怪的代码。第一个示例有点不透明,但至少首先包含空测试,并且不会隐藏show() 方法中的错误。

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

    $('#someId').show()
    

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

    【讨论】:

    • 我意识到这一点,但我的老板坚持使用原型。我喜欢,但这个问题真的很烦人。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      忽略它是哪个异常...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 2010-09-27
        • 1970-01-01
        • 2020-12-12
        • 2020-08-29
        • 2020-03-26
        • 2013-12-12
        相关资源
        最近更新 更多