ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     Error #2044:
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
bobo
投稿日時: 2011-8-2 15:06
ご主人様
登録日: 2008-10-28
居住地:
投稿: 235
Error #2044:
既出の問題ですが、Errorの2044について質問です。

FlexBuilder4で開発しています。困っているのはこのエラーが出力されるからで無く、キャッチが出来ない為です。


loader=new URLLoader();
loader.addEventListener(Event.COMPLETE,httpComplete);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			
var request: URLRequest = new URLRequest(_url);
request.method = URLRequestMethod.POST;

var param: URLVariables = new URLVariables();
try {
				loader.load(request);
} catch (error:SecurityError) {
				result.status = ERROR;
	result.message = "SecurityError";
	dispatchEvent(new HTTPRequestEvent(HTTPRequestEvent.FIXED_ERROR, null, result));
}


確かにこれで実行すると、HTTPStatusHandlerで404のエラーが帰ってくるのですが、本来はErrorをキャッチしFlashの例外ダイアログを出さずにアプリ側のエラーメッセージを表示させたいのですが、何が悪いのでしょうか?

iOErrorには入ってこず、HttpStatusチェックでエラー終了させているつもりなのですが、loaderがまだ生きているようです。

今、わざとHTTPステータス404を返していますが、この際Flashのエラー(ダイアログが表示されて止まってしまう)が出るのがまずく、内部的にキャッチして、「取得に失敗しました。」のようなエラーを出したいのですがいかがでしょうか?

FlashPlayerは10.0で、IE8,FF5で動作確認しています。

よろしくお願いいたします
Odakaz
投稿日時: 2011-8-2 16:25
ご主人様
登録日: 2008-3-11
居住地: リアル:神奈川県/バーチャル:ウィンダス
投稿: 358
Re: Error #2044:
コード断片からは全体像が分からないのであてずっぽうですが、意図していないエラーとか例外が発生しちゃってるんじゃないでしょうか。
デバッグ実行すればスタックトレースが取れるはずなんで、それで追いかけてみてはどうでしょう。

あと、

引用:
iOErrorには入ってこず、HttpStatusチェックでエラー終了させているつもりなのですが、loaderがまだ生きているようです。

というのもよくわかりません。コードのどの部分のことでしょうか。


----------------

bobo
投稿日時: 2011-8-3 9:38
ご主人様
登録日: 2008-10-28
居住地:
投稿: 235
Re: Error #2044:
失礼しました。

このようにチェックしているのですが、HTTPStatusチェックでhttpStatusHandlerに入り、カスタム化したEventで返していますが、dispatchEventでこのクラスの処理は終了させているつもりです。

ただ、httpStatusHandler処理後にもloaderが生きているようでioErrorのエラーログが出力されます。

よろしくお願いします。

package test {
	
	import test.HTTPRequestEvent;
	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.HTTPStatusEvent;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
	import flash.net.URLLoaderDataFormat;
	
	import mx.rpc.http.HTTPService;
	import mx.controls.Alert;

	/**
	 * HTTP通信のコントロールクラスです
	 * 
	 */
	public class HTTPRequestController extends EventDispatcher {
		
		// URLローダー
		private var loader:URLLoader=new URLLoader();
		// 返却オブジェクト
		private var result:Object = null;

		/**
		 * コンストラクタ
		 * 
		 */
		public function HTTPRequestController() {
			super();
			result = new Object();
		}

		/**
		 * HTTP通信を開始します
		 * 
		 * @param _url URL
		 * @param _prm POSTパラメータ
		 */
		public function execute(_url:String, _prm:Array = null): void{
			clearListner();
			loader=new URLLoader();
			loader.addEventListener(Event.COMPLETE,httpComplete);
			loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

			var request: URLRequest = new URLRequest(_url);
			request.method = URLRequestMethod.POST;

			var param: URLVariables = new URLVariables();
			if (_prm != null) {
				for (var i:int = 0; i < _prm.length; i++) {
					param[_prm[i].id] = _prm[i].value;
				}
			}
			request.data = param;
			loader.dataFormat = URLLoaderDataFormat.TEXT;
			loader.load(request);
		}
		
		/**
		 * HTTP通信完了時に処理を開始します
		 * 
		 * @param evt Event
		 */
		private function httpComplete(evt:Event):void{
			result.status = "SUC";
			result.data = evt.target.data;

			clearListner();
			dispatchEvent(new HTTPRequestEvent(HTTPRequestEvent.FIXED_COMP, null, result));
		}

		/**
		 * HTTP通信完了時に処理を開始します
		 * (ステータスチェックを行います)
		 * 
		 * @param evt HTTPStatusEvent
		 */
		private function httpStatusHandler(evt:HTTPStatusEvent):void {

			var stat:int = evt.status;
			if (stat != HTTPRequestEvent.HTTP_STATUS_SUCCESS) {
				result.status = "ERR";
				result.message = evt.target.toString();
				
				clearListner();
				dispatchEvent(new HTTPRequestEvent(HTTPRequestEvent.FIXED_ERROR, null, result));
			}
		}

		/**
		 * HTTP通信エラー時に処理を開始します
		 * (IOエラー)
		 * 
		 * @param evt IOErrorEvent
		 */
		private function ioErrorHandler(evt:IOErrorEvent):void {

			result.status = "ERR";
			result.message = evt.target.toString();

			clearListner();
			dispatchEvent(new HTTPRequestEvent(HTTPRequestEvent.FIXED_ERROR, null, result));
		}

		/**
		 * HTTP通信エラー時に処理を開始します
		 * (セキュリティエラー)
		 * 
		 * @param evt SecurityErrorEvent
		 */
		private function securityErrorHandler(evt:SecurityErrorEvent):void {
			
			result.status = "ERR";
			result.message = evt.target.toString();
			
			clearListner();
			dispatchEvent(new HTTPRequestEvent(HTTPRequestEvent.FIXED_ERROR, null, result));
		}
		
		/**
		 * HTTP通信で使われたリスナーを全て削除します
		 * 
		 */
		private function clearListner():void{
			if (loader != null) {
				loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
				loader.removeEventListener(Event.COMPLETE,httpComplete);
				loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
				loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
				loader = null;
			}
		}
	}
}

bobo
投稿日時: 2011-8-3 9:43
ご主人様
登録日: 2008-10-28
居住地:
投稿: 235
Re: Error #2044:
ダイアログに出力されるログです。

Error #2044: ハンドルされていない ioError : text=Error #2032: ストリームエラー。 URL: http://lhost:8888/test
	at test.control::HTTPRequestController/execute()[C:\test\\control\HTTPRequestController.as:48]
	at test.panel::Chart/searchChart()[C:\test\l\AAAScript.as:231]
Odakaz
投稿日時: 2011-8-3 12:15
ご主人様
登録日: 2008-3-11
居住地: リアル:神奈川県/バーチャル:ウィンダス
投稿: 358
Re: Error #2044:
URLローダーのhttpStatusイベントのドキュメントによると、

引用:
httpStatus イベントが送出される場合、このイベントは、complete イベントまたは error イベントの前に、これらのイベントとは別に送信されます。

とあるので、httpStatusHandlerの処理が通ったあとに、何かエラーが発生しているのではないでしょうか。


----------------

bobo
投稿日時: 2011-8-3 16:35
ご主人様
登録日: 2008-10-28
居住地:
投稿: 235
Re: Error #2044:
ありがとうございます。

エラーログを参照してそのような気がしていました。
StatusCheckでエラー終了した時に、URLLoaderのリスナーを削除して終了したのに、レスポンスしなければいけないioErrorが帰ってきた為、行き場を失ってFlash例外エラー。

と言うような流れのような気がしました。

そこでステータスチェックのロジック自体削ってやってみました。すると既に実装しているioErrorのハンドラで例外をキャッチできました。

と言うことはステータスチェックって一体・・何の為。
・実装してもここでは処理を終了できない。
・ioErrorでキャッチされるのであれば、ステータスチェックで行う処理が無い。

実装してはいけないと言う事になると思うのですが。。

・正常処理したのに実はHTTPSTATUS:200では無かった。

と言うシナリオがあったら、駄目ですが。

Event.HTTPComple内でそのチェック結果も一緒に見なければいけないと言う事になってきますね。

ん〜〜・・
Odakaz
投稿日時: 2011-8-3 17:01
ご主人様
登録日: 2008-3-11
居住地: リアル:神奈川県/バーチャル:ウィンダス
投稿: 358
Re: Error #2044:
それぞれで役割がちがうので、無理に一緒に考えないほうがいいのではと思います。


HTTPステータスを見る必要がないなら見なくてもいいでしょうし、ioErrorイベントは、
引用:
URLLoader.load() の呼び出し時に致命的なエラーが発生してダウンロードが終了した場合に送出されます。

ってことらしいので、HTTPステータスのハナシとはまた違います。

あと、

/** * HTTP通信で使われたリスナーを全て削除します * */
private function clearListner():void{
    if (loader != null) {
        loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
        loader.removeEventListener(Event.COMPLETE,httpComplete);
        loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);
        loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader = null;
    } 
}


これだと単にURLLoaderへの参照を切ってるだけなので、ロードの処理が動いたままになるのではと思います。
で、そこでエラーが起きてioErrorイベントが発生しているのではないでしょうか。

loadを中断したいならcloseを呼ぶ必要がありますね。
もっとも、エラーの原因はさすがにこちらでは分からないので、これで直ると断言はできませんが。
#逆に、無効なストリームエラーが発生する可能性もあります。


----------------

bobo
投稿日時: 2011-8-8 11:08
ご主人様
登録日: 2008-10-28
居住地:
投稿: 235
Re: Error #2044:
ありがとうございます。

closeも加味すると色々ややこしくなってきてしまう為、ステータスチェックを除去しました。
また、HTTPのステータスエラーの時は必ずioErrorに飛ばされてくるとIE&FFでは確認した為、必要ないと判断しました。

あまりしっくり来る解決法ではありませんが。。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を