Flex ですべての例外をキャッチするにはどうすればよいですか?
-
01-07-2019 - |
質問
デバッグ フラッシュ プレーヤーで Flex アプリケーションを実行すると、予期しないことが起こるとすぐに例外ポップアップが表示されます。ただし、顧客がアプリケーションを使用する場合、デバッグ フラッシュ プレーヤーは使用しません。この場合、例外ポップアップは表示されませんが、UI は機能しません。
したがって、サポート性の理由から、Flex UI のどこでも発生する可能性のある例外をキャッチし、Flex の内部ポップアップにエラー メッセージを表示したいと考えています。Java を使用すると、UI コード全体を try/catch ブロックにカプセル化するだけですが、Flex の MXML アプリケーションでは、そのような一般的な try/catch をどこで実行できるかわかりません。
解決
Flex 3 では、キャッチされなかった例外について通知を受ける方法はありません。Adobe はこの問題を認識していますが、回避策を作成する予定があるかどうかはわかりません。
現状の唯一の解決策は、try/catch を論理的な場所に配置し、それらを送出するすべての ERROR (Web サービスの場合は FAULT) イベントを確実にリッスンすることです。
編集: さらに、イベント ハンドラーからスローされたエラーをキャッチすることは実際には不可能です。ログを記録しました バグ Adobe Bug System 上で。
更新 2010 年 1 月 12 日: グローバル エラー処理がサポートされるようになりました。 フラッシュ10.1 そして エア2.0 (どちらもベータ版)、サブスクリプションすることで実現できます。 捕まりません_エラー の出来事 LoaderInfo.uncaughtErrorEvents. 。次のコードは、 livedocs のコードサンプル:
public class UncaughtErrorEventExample extends Sprite
{
public function UncaughtErrorEventExample()
{
loaderInfo.uncaughtErrorEvents.addEventListener(
UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
}
private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
if (event.error is Error)
{
var error:Error = event.error as Error;
// do something with the error
}
else if (event.error is ErrorEvent)
{
var errorEvent:ErrorEvent = event.error as ErrorEvent;
// do something with the error
}
else
{
// a non-Error, non-ErrorEvent type was thrown and uncaught
}
}
他のヒント
Adobe バグ管理システムには、これに関するバグ/機能のリクエストがあります。それがあなたにとって重要であれば、投票してください。
Flex 3.3 で動作します。
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
}
バグ FP-444 (上記) は次のリンクにリンクしていることに注意してください。 http://labs.adobe.com/technologies/flashplayer10/features.html#developer 2009 年 10 月以降、これは 10.1 で可能になることが示されていますが、現時点では、2009 年 10 月 28 日時点ではまだリリースされていません。つまり、リリースされたときにそれが本当かどうかがわかると思います。
受け入れられた回答の代わりに、try-catch を使用します。ゆっくりですが、より読みやすいと思います。
try {
loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
} catch (e:ReferenceError) {
var spl:Array = Capabilities.version.split(" ");
var verSpl:Array = spl[1].split(",");
if (int(verSpl[0]) >= 10 &&
int(verSpl[1]) >= 1) {
// This version is 10.1 or greater - we should have been able to listen for uncaught errors...
d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
}
}
もちろん、このコードを正常にコンパイルするには、最新の 10.1 playerglobal.swc を使用する必要があります。http://labs.adobe.com/downloads/flashplayer10.html
フレックス4を使用しています。私は試した loaderInfo.UncaughtErrorEvents,
しかし、loaderInfo が初期化されていないため、null 参照エラーが発生しました。それから私は試してみました root.loaderInfo.UncaughtErrorEvents
そして同じ話。私は試した sprite.root.UncaughtErrorEvents
, しかし、スプライトオブジェクトがなかったので作成しましたが、うまくいきませんでした。最後に試してみました
systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);
そしてなんと、魔法のように機能します。チェック これ
Flex 3.5 および Flash Player 10 で動作します。
<?xml version="1.0" encoding="utf-8"?>
protected function application1_addedToStageHandler(event:Event):void{
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
}
sdk.text = "Flex " + mx_internal::VERSION;
}
private function uncaughtErrorHandler(e:*):void{
e.preventDefault();
var s:String;
if (e.error is Error)
{
var error:Error = e.error as Error;
s = "Uncaught Error: " + error.errorID + ", " + error.name + ", " + error.message;
}
else
{
var errorEvent:ErrorEvent = e.error as ErrorEvent;
s = "Uncaught ErrorEvent: " + errorEvent.text;
}
msg.text = s;
}
private function unCaught():void
{
var foo:String = null;
trace(foo.length);
}
]]>
</mx:Script>
<mx:VBox>
<mx:Label id="sdk" fontSize="18"/>
<mx:Button y="50" label="UnCaught Error" click="unCaught();" />
<mx:TextArea id="msg" width="180" height="70"/>
</mx:VBox>
ありがとう
イベント リスナーを「ルート」にアタッチしました。これでうまくいきました。
sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
デバッグ Flash Player ではこれでもエラーが発生しますが、非デバッグ バージョンでは Flash Player のダイアログ ボックスにエラーが表示され、ハンドラーが応答します。ダイアログ ボックスの表示を停止するには、次を追加します。
event.preventDefault();
それで:
private function onUncaughtError(event:UncaughtErrorEvent):void
{
event.preventDefault();
// do something with this error
}
私はこれを AIR で使用していましたが、標準の AS3 プロジェクトでも機能すると思います。
ローダー情報を使用して、次のようにできるようになりました。
http://www.adobe.com/devnet/flex/articles/global-Exception-handling.html
チェックアウト:loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
private function onUncaughtError(e:UncaughtErrorEvent):void
{
// Do something with your error.
}