我无法捕捉到错误

时间:2014-05-13 17:54:58

标签: flex

我无法在下面的简化代码中捕获抛出的错误。这是为什么? 根据stackoverflow的要求,我必须插入更多信息,但这个例子非常简单。你能用这个例子帮我吗?

package com.myserver {

public class ReturnInfo extends Sprite {

public function ReturnInfo(urlParamsArr:Array) {

    try {
        var client:HttpClient = new HttpClient();
        var uri:URI = new URI("http://valid-url.com/aaa.php");

        client.listener.onData = function(event:HttpDataEvent):void {
          throw new Error();
        };

        client.listener.onError = function(event:IOErrorEvent):void {
            trace("error");
        };          

        client.postFormData(uri, variables);
    }
    catch (e:Error){
        trace("Error was caught.");
    }
} 
} //class
} //package

我也试过了:

try {
new ReturnInfo(urlParamsArr);
}
catch(e:Error){
trace("caught error");
}

它也不起作用。

2 个答案:

答案 0 :(得分:1)

代码不起作用,因为稍后会执行抛出错误的代码,因此您需要在client.listener.onData处理程序中使用try-catch。我假设的那个处理程序有时会被调用,所以当你解析或处理数据时,确保捕获/处理错误

答案 1 :(得分:1)

再加上Simion所说的,问题是方法关闭。为了在食品链中的某个地方捕获例外情况" catch需要在堆栈中 - 你将通过getStackTrace()知道当前堆栈中的内容。在这个例子中,没有堆栈指针位于构造函数(或任何方法),就像client.listener.onData一样 - 这就是postFormData将执行的原因。当事件被触发时,它的堆栈指针返回到第一个实际启动事件触发器的起始点(而不是声明它的方法)。这也是第二次尝试失败的原因。

再加上FP在帧中执行离散块的事实(想象这就像堆一样),在dispatchEvent范围内执行的任何东西通常都会有很小的堆栈或根本没有堆栈(例如第一个堆栈)指针通常是调度程序本身 - 而不是实际调用它的方法。)

try-catch最好在方法的同一范围内尝试。 一个伪示例:

function getOrCreateWidget():Widget {
var a:Widget;
try {
  a = getWidet();
}
catch(e:TypeError) {
  a = createNewWidget();
}
//finally can be debatable - most of us leave it off 
//bc it executes anyway just as it would in the function scope.
finally {
  a.property = 'foo';
}

return a;
}

如果这是不可能的 - 最后的努力就是将一个监听器附加到loaderInfo.uncaughtErrorEvents。通常将此与systemManager相关联是最佳选择,因为SM知道显示树的每个分支,直到根阶段。分配这种方法中的所有偏差既不好也不实用,因为程序员的许多上下文通常都会丢失。它更像是一个对不起的用户,我们的应用程序刚刚完成。"

相关问题