使用YUI3时捕获Javascript语法错误

时间:2009-11-24 21:18:09

标签: javascript exception-handling yui yui3

我正在使用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);
}

我尝试在try / catch中包装“var myDataSource”块,我也尝试包装整个YUI()。use()块。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

DataSource.Get的合同是服务器支持JSONP。这种方式的工作方式是Get将一个脚本节点添加到页面中,其中src =(您提供的URL)&amp; callback = someDataSourceFunction。

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

  1. 服务器将以someDataSourceFunction({“all”:“your data”})的形式响应JavaScript字符串;或
  2. 服务器将返回一些无法解析为JavaScript的文本。
  3. 在任何一种情况下,该字符串都被视为脚本节点的内容 - 它被解析并执行。如果无法解析,浏览器将抛出错误。没有阻止这一点。虽然JSONP在技术上不受真正JSON的规范约束(即使是无效的JSON应该解析和执行),但是你应该总是使用纯JSON,并且总是使用服务器端lib来生成JSON输出(在http://json.org上查找每种可能的语言中的库列表)。不要手动滚动JSON。它只会导致数小时的调试。

答案 2 :(得分:0)

也许在“doSomething”之前尝试这个:

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