【问题标题】:Catch Javascript syntax errors while using YUI3使用 YUI3 时捕获 Javascript 语法错误
【发布时间】:2010-12-20 01:30:21
【问题描述】:

我正在使用 YUI 团队提供的稍作修改的示例代码。当我的源响应 JSON 以外的内容(或只是出现 JSON 语法错误)时,我的浏览器 (Safari) 会中止脚本处理,从而阻止我通知用户出现问题。

我绝对不是 JS 专家,所以这段代码可能比它必须的要丑得多。代码大致是:

YUI().use("dump", "node", "datasource-get", "datasource-jsonschema", function(Y) {
  var myDataSource = new Y.DataSource.Get({
    source:"/some/json/source/?"}),
    myCallback = {
      success: function(e){
        myResponse = e.response;
        doSomething(myDataSource);
      },
      failure: function(e){
        Y.get("#errors").setContent("<li>Could not retrieve data: " + e.error.message + "</li>");
      }
    };

  myDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
    schema: {
      resultListLocator: "blah.list",
      resultFields: ["user", "nickname"]
    }
  });
  myDataSource.sendRequest("foo=bar", myCallback);
}

我尝试将“var myDataSource”块包装在 try/catch 中,并且我还尝试包装整个 YUI().use() 块。

是否可以捕获语法错误?我是否必须用单独的 IO 和解析调用替换一体化 DataSource.Get 调用?

【问题讨论】:

    标签: javascript exception-handling yui yui3


    【解决方案1】:

    由于您请求的是本地脚本,因此您可以在 try/catch 或 Y.DataSource.IO + Y.DataSchema.JSON (+ Y.JSON) 中使用 Y.io + Y.JSON.parse。

    DataSource.Get 的好处是它避免了同源策略。但是,它的安全性和灵活性较差。如果没有必要,你应该避免使用它。

    DataSource.Get 的约定是服务器支持 JSONP。其工作方式是 Get 使用 src=(您提供的 url)&callback=someDataSourceFunction 向页面添加一个脚本节点。

    浏览器将请求该 url 的资源,并且会发生以下两种情况之一:

    1. 服务器将以 someDataSourceFunction({"all":"your data"}); 形式的 JavaScript 字符串响应或
    2. 服务器将返回一些无法解析为 JavaScript 的文本。

    在任何一种情况下,该字符串都被视为脚本节点的内容——它被解析并执行。如果无法解析,浏览器会抛出错误。这没有停止。虽然 JSONP 在技术上不受真正 JSON 的规范约束(即使是无效的 JSON 也应该解析和执行),但您应该始终使用纯 JSON,并始终使用服务器端库来生成 JSON 输出(查看http://json.org 以获取列表所有可以想象的语言中的库)。不要手动滚动 JSON。它只会导致数小时的调试。

    【讨论】:

      【解决方案2】:

      问题可能是在 YUI 甚至有机会报告失败之前,浏览器中的某个级别(Javascript 解析)发生了错误。

      众所周知,在没有实现 window.onerror 的 Safari 中很难捕捉到这种错误。为了在我的Javascript library, bezen.org 中捕获更多错误,我在触发异步代码的地方添加了 try/catch:

      • 动态脚本加载(相当于您的 JSON 下载)
      • setTimeout/setTimer:我包装并替换了这些浏览器函数以插入一个记录错误的 try/catch

      您可能有兴趣查看相应模块的源代码,这可能对您有用或作为解决问题的提示:

      【讨论】:

        【解决方案3】:

        也许在你“做某事”之前试试这个:

        try
        {
           var test = YAHOO.lang.JSON.parse(jsonString); 
           ...
        }
        catch (e)
        {
           alert('invalid json');
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-15
          • 1970-01-01
          相关资源
          最近更新 更多