Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Обработать любую ошибку не закрывая программу - Android

12.02.2014, 06:36. Просмотров 668. Ответов 9
Метки нет (Все метки)

Возможно ли (тяжело ли) подобное? В программе сотня методов и возможно допустить ошибку в одной из них. Или не обработать (полениться или не предусмотреть) все через try...

Умею (нашел модуль/класс и переработал не до конца поняв) обрабатывать глобальную ошибку вылетания программы - выводит код ошибки в диалог и записывает в текстовик, отправляет в LogCat. Оригинальный модуль (убрал это) предлагал даже ошибку по почте отправить...

Но после этого модуля программа все-равно закрывается... Можно ли ПРОИГНОРИРОВАТЬ(обработать/записать в файл) ошибку в методе но не закрывать окно/программу? Не нравится что заполнив кучу полей клиент нажимает редкую (не доделаную) кнопочку и должен набирать все заново перезапустив программу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.02.2014, 17:36     Обработать любую ошибку не закрывая программу #2
Tester64, может Вам поможет ACRA , но я не уверен, что это точно поможет (это система оповещения о crash'ах).

А ещё можно попробовать так.

Java
1
2
3
4
5
6
7
public class ChildActivity extends BaseActivity {
 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int a=1/0;
}}
где

Java
1
2
3
4
5
6
7
8
9
10
11
public class BaseActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
            Log.e("Alert","Some exception");
        }
    });
}}
setDefaultUncaughtExceptionHandle
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
12.02.2014, 17:46     Обработать любую ошибку не закрывая программу #3
Нет, конечно.
Как вы себе это представляете? Например, программа получила Error (не Exception!), и все, тут уже ничего не поможет.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.02.2014, 17:49     Обработать любую ошибку не закрывая программу #4
Netscape, Вы не совсем правы. А как же например OutOfMemoryError при decode bitmap?
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
12.02.2014, 18:05     Обработать любую ошибку не закрывая программу #5
YuraAAA, окей, может я не совсем удачно выразился, а может и не прав.
Когда мы получаем OOM, это значит, что память кончилась, и больше нам не выделят.
Что делать дальше? Не создавать новых объектов - толку тогда от того что мы словили эту ошибку, попросить gc очистить память - не факт, что он нас послушает?

Добавлено через 3 минуты
А ведь есть еще нейтив, который сразу крэшит VM.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.02.2014, 18:37     Обработать любую ошибку не закрывая программу #6
Netscape, ну да. Тогда да) Попросить GC и просто не декодить картинку. Ну или как вариант WeakReference<Bitmap>
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
12.02.2014, 18:37  [ТС]     Обработать любую ошибку не закрывая программу #7
2YuraAAA: Спасибо. Попробую...

Цитата Сообщение от Netscape Посмотреть сообщение
Нет, конечно.
Как вы себе это представляете? Например, программа получила Error (не Exception!), и все, тут уже ничего не поможет.
Не вижу разницы между Error(?) и Exception...
Представляю себе как глобальный try на каждый метод. Например обработку на нажатие кнопки. Что-бы внутри обработки не случилось(деление на ноль, ошибка записи/чтения, неправильный запрос), прерваться должна только ЭТА обработка, а не закрыться вся форма (или вся программа).

Пока не представляю себе как, но сильно привык к подобному в винде. А на сложных программах это просто необходимо... Как и теоретически на программах разрабатывамых КОМАНДАМИ программистов - "я не могу отвечать за ошибки соседа - моя часть не глючит - платите мне зарплату"
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
12.02.2014, 18:44     Обработать любую ошибку не закрывая программу #8
Цитата Сообщение от Tester64 Посмотреть сообщение
Не вижу разницы между Error(?) и Exception...
В таких случаях, обращаемся к докам:
http://docs.oracle.com/javase/7/docs...ang/Error.html
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions.
Цитата Сообщение от Tester64 Посмотреть сообщение
А на сложных программах это просто необходимо... Как и теоретически на программах разрабатывамых КОМАНДАМИ программистов - "я не могу отвечать за ошибки соседа - моя часть не глючит - платите мне зарплату"
Именно для этого и пишут тесты.
vladimirsky
3 / 3 / 1
Регистрация: 18.09.2013
Сообщений: 19
13.02.2014, 11:54     Обработать любую ошибку не закрывая программу #9
Цитата Сообщение от Netscape Посмотреть сообщение
Именно для этого и пишут тесты.
Реальность такова, что охватить все большое приложение тестами, не представляется возможным.
Стоимость и время разработки сильно увеличивается. Кроме того все варианты ошибок тестами не перекроешь.

А в общем то, я считаю, что любую ошибку приложения разработчик должен иметь возможность перехватить.
Как бы там красиво не рассуждали в документации, это недостаток.
Приложения становяться все сложнее. Падение в одном модуле не значит, что все приложение не валидно.
Например, пользователь набрал большой текст, хочет выполнить какую-нибудь комманду, не связанную с текстом, а приложение падает. Текст потерян.
Так вот пользователю наплевать, как красиво мы рассуждали про правильность разделения по типам ошибок и
какую красивую архитектуру мы построили.
Потому что ПОЛЬЗОВАТЕЛЬ ВСЕГДА ПРАВ!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 17:44     Обработать любую ошибку не закрывая программу
Еще ссылки по теме:

Android Обработать нажатие на кнопки в уведомлении
Android Как обработать нажатие на ImageView? Eclipse(android)
Обработать событие onBackPressed во фрагменте Android
Android Как можно в checkbox установить любую нужную мне иконку
Как обработать нажатие на изображение в элементе listView? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
13.02.2014, 17:44  [ТС]     Обработать любую ошибку не закрывая программу #10
Цитата Сообщение от YuraAAA Посмотреть сообщение
А ещё можно попробовать так
Не помогло! Все что это делает - перед вылетанием выводит сообщение. Причем ТОЛЬКО в той форме где было определено в OnCreate. На другие активити не распространяется. У меня как раз так-же было перехвачено раньше. Просто класс был покруче и мог получать полный текст ошибки и отсылать его. Но завершение программы пресечь не получается.

Цитата Сообщение от vladimirsky Посмотреть сообщение
Например, пользователь набрал большой текст
Теоретически стоило бы сохранять по таймеру этот текст, но конечно логичнее будет пресечь зависание. Конечно можно КАЖДЫЙ метод начинать и заканчивать try{ } catch (Exception e) {OnError("ERROR! "+e.toString())} но когда методов сотни...

Цитата Сообщение от YuraAAA Посмотреть сообщение
может Вам поможет ACRA
Насколько я понял это тот-же обработчик, но с отправкой ошибки на гугл-док. Предпочитаю не оповещать гугл о своих ошибках!
Yandex
Объявления
13.02.2014, 17:44     Обработать любую ошибку не закрывая программу
Ответ Создать тему
Опции темы

Текущее время: 13:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru