AS2的异常Error

发表评论 阅读评论

前几天在调试一个AS2跟后台通信的程序,一直看不到正常的数据显示,然后就挨行trace,终于发现问题所在了.
原来是用了AS2的一个JSON类,如果格式不是json格式就会抛出异常,因为我们的数据格式不会错的,要么就没有数据,否则不会出现格式错误的,所有就没有try catch。
刚好这次测试的时候有一个元素里没有数据,json串为""(空字符串)。然后解析的时候抛了个异常,我没有捕获,就终止那段程序。
请看AS2的JSON里抛异常的方式:

function error(m) {
    throw {
        name: 'JSONError',
        message: m,
        at: at - 1,
        text: text
    };
}

这里直接抛出一个Object而不是Error类的实例,然而AS2的异常提示跟AS3不同。

AS3:

在装有debug flashplayer的浏览器里弹出一个窗口提示错误。
在IDE的output面板里显示类似下面的错误提示。

Error: this is an error!
    at _fla::MainTimeline/frame1()

AS2:

在装有debug flashplayer的浏览器里不提示任何错误。
在IDE的output面板里仅输出抛出的对象或类型的String形式。

this is an error!

OK,看了这两个不同,再看AS2的JSON抛出异常的方式,它仅仅抛出一个Object对象。
然后Object对象转到String默认是 [object Object] 这样一个字符串的。
当我看到这个字符串输出后,首先想到的是哪里直接输出对象了,根本没有想到会是JSON抛出的异常。
所以问题就很难被发现,最后终于在我一行一行trace下找到原因了。

好了,有了上面的经验,我可以定制一些规则,好让问题更容易的被发现。
throw异常的时候一定要抛出Error或者Error的子类的实例.
因为用Error有下列的优势:

  1. Error本身就有toString()方法,我们就不会再为模糊的[object Object]而烦恼了.
  2. AS3的Error还有getStackTrace()方法来追踪错误发生的地点.虽然只能在debug版本里用.
  3. 常规我们捕获异常的时候只会判断Error,类似于** catch(err:Error)**这样的,但是如果我们不是throw的Error或Error的子类,那么这个异常就不能被捕获。
标签: , , ,

  1. lite3 | | #1

    @精思入神
    这里有个AS3的JSON类的 http://lite3lib.googlecode.com/files/JSON.as
    具体用法在里面有写的 :grin:

  2. 精思入神 | #2

    请教一个问题:AS2 里面的如何使用 JSON 对象。 原来的作品是AS2的,现在需要从后台取得数据,数据格式是JSON字符串,AS2里面如何将这个字符串转换为JSON对象? 查了一下,都是AS3的例子。其他的范例调试通不过,文献少得可怜。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部