Как перехватить все исключения в Flex?
-
01-07-2019 - |
Вопрос
Когда я запускаю приложение Flex в отладочном Flash Player, я получаю всплывающее исключение, как только происходит что-то неожиданное.Однако, когда клиент использует приложение, он не использует отладочный flash player.В этом случае у него не появляется всплывающее исключение, но пользовательский интерфейс не работает.
Поэтому по соображениям поддержки я хотел бы перехватить любое исключение, которое может произойти в любом месте пользовательского интерфейса Flex, и представить сообщение об ошибке во внутреннем всплывающем окне Flex.Используя Java, я бы просто инкапсулировал весь код пользовательского интерфейса в блок try / catch, но с приложениями MXML в Flex я не знаю, где я мог бы выполнить такую общую попытку / catch.
Решение
Во Flex 3 нет способа получать уведомления о неперехваченных исключениях.Adobe знает об этой проблеме, но я не знаю, планируют ли они создать обходной путь.
Единственное решение в его нынешнем виде - поместить try / catch в логические места и убедиться, что вы прослушиваете событие ERROR (или FAULT for webservices) для всего, что их отправляет.
Редактировать: Более того, на самом деле невозможно перехватить ошибку, выданную обработчиком событий.Я зарегистрировал ошибка в системе Adobe Ошибка.
Обновление 2010-01-12: Глобальная обработка ошибок теперь поддерживается в Вспышка 10.1 и ВОЗДУХ 2.0 (оба в бета-версии), и достигается путем подписки на НЕПЕРЕХВАЧЕННАЯ ОШИБКА событие из LoaderInfo.Необнаруженные события.Следующий код взят из пример кода на 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.1, которая в настоящее время, 28 октября 2009 года, все еще не выпущена - так что, я думаю, мы увидим, правда ли это, когда она выйдет
Альтернатива принятому ответу, используя 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
Я использую flex 4.Я пытался loaderInfo.UncaughtErrorEvents,
но LoaderInfo не был инициализирован, поэтому он выдал мне ошибку с нулевой ссылкой.Тогда я попробовал 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>
Спасибо
Я подключил прослушиватель событий к "root", что сработало у меня:
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.
}