首页 > AS > throw error 异常

throw error 异常

2010年3月28日 发表评论 阅读评论

前几天在调试一个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抛出的异常. :mrgreen:
所以问题就很难被发现,最后终于在我一行一行trace下找到原因了 :cry:

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

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

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

  2. 2010年4月25日12:04 | #2

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

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
有话直说(用户名,邮箱只需填写一次,然后保存到cookie里,第二次将不必重新填写)