flash 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有下列的优势:
Error本身就有toString()方法,我们就不会再为模糊的[object Object]而烦恼了.
AS3的Error还有getStackTrace()方法来追踪错误发生的地点.虽然只能在debug版本里用.
常规我们捕获异常的时候只会判断Error 类似于 catch(err:Error)这样的,但是如果我们不是throw的Error或Error的子类,那么这个异常就不能被捕获.
补充:flash教程,动画技术