Nano Hash - криптовалюты, майнинг, программирование

отображение ошибок времени выполнения в установленном приложении android / ios

Я пытался отображать ошибки в текстовом поле в приложении, чтобы пользователи могли сообщать об ошибках.

У меня был некоторый успех, используя этот код, который я нашел в stackoverflow. Он используется на верхнем уровне приложения, но не работает на устройстве:

//start code
this.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, errorHandler);  

function globalErrorHandler(event:UncaughtErrorEvent):void  
{  
    var message:String;  
    //check for runtime error  
    if (event.error is Error)  
        message = (event.error as Error).getStackTrace();  
    //handle other errors  
    else if (event.error is ErrorEvent)  
        message = (event.error as ErrorEvent).text;  
    else  
        message = event.error.toString();  
    //do something with message (eg display it in textfield)  
    myTextfield.text = message;  
}  
//end code

Сначала это не сработало на устройстве, и я подумал, что это произошло потому, что при возникновении ошибки при разработке на компьютере flashplayer отображал всплывающее окно ActionScript с ошибкой. Вам нужно будет нажать «закрыть все» или закрыть, а затем будет вызван globalErrorHandler, а затем ошибка будет записана в текстовое поле. Я думал, что это мешает ему появиться на устройстве. Однако, добавив event.preventDefault (), я смог подавить всплывающее окно ActionScript при разработке на рабочем столе, и ошибка была успешно записана в текстовое поле. Однако на устройстве andriod этого не произошло. Все равно просто зависает на ошибке. Как будто событие ошибки по умолчанию не может быть подавлено на android.

Спасибо за ваше время. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ 22/09/2017: я наконец смог увидеть ошибку на устройстве. Это было связано с тем, что при публикации на настольных компьютерах отображалась ошибка. Однако на устройстве поведение было другим, и что-то закрывало текстовое поле, и, переместив его на передний план при ошибке, я смог это увидеть. Тем не менее, я все еще вижу, что некоторые ошибки глубже в иерархии классов не обнаруживаются.


  • Какую версию AIR вы используете? В более старых версиях getStackTrace() возвращал null в средах без отладчика. 21.09.2017
  • @Aaron, я пользуюсь последней версией аир 26 22.09.2017

Ответы:


1

В нашем проекте он попроще (и он работает):

stage.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Console is basically a TextField for debug/diagnosis output.
    if (e.error) Console.error(e.error.getStackTrace());

    e.preventDefault();
}

Еще вам, вероятно, следует проверить, действительно ли ваше TextField отображает какой-либо текст вообще, поскольку могут возникнуть проблемы с встраиванием текста, не связанные с процедурой обработки ошибок.

UPD: загружает SWF-файлы, чтобы они не смешивались с родительским.

var request:URLRequest = new URLRequest(path);

var context:LoaderContext = new LoaderContext;
context.applicationDomain = ApplicationDomain.currentDomain;

var loader:Loader = new Loader;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.load(request, context);
21.09.2017
  • Спасибо за вашу помощь! Я попытался заменить свой код вашим более простым подходом, но это не сработало. Я проверил текстовое поле, установив текст, чтобы убедиться, что он виден на устройстве, и это было. Однако ваше взаимодействие заставило меня больше возиться, и я определил, что он действительно работает на устройстве, создав другую ошибку. Исходной ошибкой, которая отображалась на рабочем столе, но не на устройстве, была ошибка № 1010: термин не определен и не имеет свойств. Однако мое приложение использует базу данных, и создание таблицы с ошибкой № 3115, которая уже существует, показало ошибку на устройстве. Странно, правда? 21.09.2017
  • По мере того, как я тестирую его больше, я обнаруживаю, что даже на настольном тестировании он не всегда обнаруживает ошибку и предотвращает появление всплывающего окна по умолчанию при размещении в различных частях иерархии классов. И при тестировании на устройстве кажется, что ошибка вообще не отображается, когда это нулевое исключение, например: 'var testnull: String = null; трассировка (testnull.toString ()); ' 21.09.2017
  • @cyboman Хммм ... Попробуйте подписаться на stage.loaderInfo.uncaughtErrorEvents вместо this. 21.09.2017
  • Я попытался изменить его на этап, но это все еще не решило проблему, не обнаружив ошибок глубже в иерархии. Не знаю почему. Он находится в Main.as, поэтому я не уверен, почему не возникают ошибки. 22.09.2017
  • Также я должен добавить, что возникла проблема с тем, что текстовое поле не было видно на устройстве, я отредактировал их основной пост, чтобы отразить это. Сейчас я вижу, что ошибки обнаруживаются, но я все еще не углубляюсь в иерархию классов. Однако функциональность как есть по-прежнему полезна. Спасибо за вашу постоянную помощь! 22.09.2017
  • я обнаружил, что корневой или основной класс только перехватит ошибку времени выполнения и предотвратит поведение по умолчанию, если подкласс может видеть это и не имеет stage, parent и т. д. как null. В противном случае событие не будет распространяться, что имеет смысл. Однако это ограничивает возможности просмотра, чтобы ограничить полезность этого метода для сообщения или обнаружения таких ошибок. 22.09.2017
  • на самом деле после дополнительного тестирования не кажется, что видимость родителя имеет какое-либо отношение к тому, что он работает стабильно, может быть, это ошибка? 22.09.2017
  • @cyboman Насколько я знаю, их нет. В моем приложении эта штука работает нормально. Если есть исключение - оно вылавливается и отображается. Явных неудач нет, но и исключений нет. Может быть, здесь что-то еще играет важную роль. Ваше приложение - это целое? Или вы загружаете какие-то дополнительные модули с кодом из нескольких SWF? 22.09.2017
  • Дело не в том, что нет исключений, если я вставлю ошибку времени выполнения, она всегда будет показывать ошибку. Дело в том, что при внедрении в различные части кода он иногда не будет пойман слушателем верхнего основного класса. Вместо этого поведение по умолчанию не предотвращается, и он просто показывает всплывающее окно ActionScript, как обычно, и слушатель никогда не запускается. На этом этапе тестирования я не проверял ошибки во внешних файлах swf (есть только один объект анимации). 22.09.2017
  • Я тестирую больше и, похоже, ограничивается одним подклассом. Это сложно, потому что кажется, что поведение в целом непоследовательно. Спасибо за вашу помощь! 22.09.2017
  • поэтому, когда вы упомянули, что внешние swf-файлы являются возможной причиной, я посмотрел глубже. Кажется, что у одного класса, с которым возникла проблема, есть предварительный загрузчик, который загружает некоторые ресурсы перед фактическим вызовом функции init класса. Однако у актива нет кода, его анимация обрабатывается внутри загружаемого класса. Когда запускается событие загрузчика, добавленное в stage. Тогда любая ошибка, вставленная где-либо после этого в классе, прерывается и не фиксируется в основном классе. Не уверен, почему добавление SWF в сцену может его сломать. 22.09.2017
  • Да, если я вставлю ошибку после того, как загрузчик будет удален со сцены, ошибка будет распространяться на главную, как и ожидалось. Есть идеи, почему наличие внешнего swf на сцене нарушает это поведение? 22.09.2017
  • @cyboman У меня есть идея, так что вы можете ее проверить. Вы отслеживаете неперехваченные ошибки на stage.loaderInfo. Затем вы загружаете другой SWF-файл, у которого есть собственный объект LoaderInfo, в Loader.contentLoaderInfo. Более того, они оба находятся в одной изолированной программной среде приложения, и их классы и объекты смешиваются. Смотрите мой обновленный пост. 22.09.2017
  • спасибо за ваш вклад. Я обязательно попробую. Общение с вами значительно приблизило меня к пониманию того, что происходит. Большой реквизит! 23.09.2017
  • Кроме того, используете ли вы этот подход при выпуске сборок своих приложений? Знаете ли вы, что такое снижение производительности при использовании этого метода? 23.09.2017
  • @cyboman Существует довольно много действий, которые вы можете (или должны) сделать перед созданием релизных сборок, и эти действия зависят от того, какое у вас приложение, на какую платформу вы нацеливаетесь и так далее. Один комментарий не стал бы охватывать все это. 23.09.2017
  • конечно, мне просто интересно, влияет ли эта обработка ошибок на производительность. Знаете ли вы какие-нибудь официальные онлайн-руководства по Adobe, в которых рассказывается о таких предполетных действиях. Очень признательны за ваше руководство! 23.09.2017
  • @cyboman Нет, я ничего не знаю. Для меня это годы непрерывного опыта. 23.09.2017
  • К сожалению, загрузка загрузчика в его собственном домене приложения не устранила проблему. Он по-прежнему не обнаруживает ошибку после загрузки внешнего swf. Обратите внимание, что в этом swf тоже нет кода. Как только swf удален, срабатывает отлов ошибок. 23.09.2017
  • @cyboman Я рекомендую вам прочитать о LoaderContext и ApplicationDomain и попробовать варианты, которые они позволяют. 23.09.2017
  • Хорошо, я попробую в следующий раз. Спасибо! 23.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..