我无法在下面的简化代码中捕获抛出的错误。这是为什么? 根据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");
}
它也不起作用。
答案 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知道显示树的每个分支,直到根阶段。分配这种方法中的所有偏差既不好也不实用,因为程序员的许多上下文通常都会丢失。它更像是一个对不起的用户,我们的应用程序刚刚完成。"