Пример кода для обработки исключений - PullRequest
9 голосов
/ 27 сентября 2010

Я новичок в разработке мобильных приложений для Android.Я хотел бы знать, как я могу обрабатывать исключения, такие как HttpConnection связанные исключения или любые другие исключения?Нужно ли отображать AlertDialog для пользователя?

Пожалуйста, предоставьте пример кода или исходный код проекта о том, как я могу обработать HttpConnection или подобные исключения типа.

Ответы [ 3 ]

17 голосов
/ 23 февраля 2011

В Java существует два вида исключений: проверено и не проверено. Существует большая дискуссия о том, какой из них лучше использовать, оба аргумента хороши.

По сути, исключение Checked является производным от java.lang.Exception и требует, чтобы, если вы не указали свой метод как «throws MyCheckedException», вы должны перехватить и обработать исключение в вашем методе.

// throw the exception

void foo() throws MyCheckedException
{
    throw new MyCheckedException();
}

// or handle the exception

void foo()
{
    try {
       throw new MyCheckedException();
    } catch (MyRuntimeException e) {
        e.printStackTrace();
    }
}

Исключение Unchecked, полученное из java.lang.RuntimeException, не требует, чтобы вы указывали «throws» в определении вашего метода или обрабатывали его.

void foo()
{
    throw new MyUncheckedException();
}

Преимущество Checked заключается в том, что компилятор предупредит вас, если вы не обработали исключение.

Недостатком является то, что вы должны объявлять блок try / catch или throws для каждого исключения Checked, и код верхнего уровня может стать довольно громоздким, пытаясь обработать все различные типы исключений.

По этой причине, если вы осторожны, вы можете предпочесть использование непроверенных исключений.

Кстати, вы можете выбрать тип исключения только тогда, когда определите свой собственный.

При обнаружении исключений из Java или сторонней библиотеки вы должны решить, как с этим справиться. например Если сторонний метод выбрасывает CheckedException1, то вы должны либо обработать его, либо объявить вызывающий метод как «throws CheckedException1». Если вы хотите избежать использования проверенных исключений, вы можете заключить их в исключение непроверенных и выбросить их.

void foo() // no throws declaration
{
    try {
        thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
    }
    catch (CheckedException1 e) {
        throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
    }
}

Обратите внимание, что вы можете вызвать исключение Unchecked без объявления throws. Чтобы получить доступ к исходному CheckedException1 сверху вниз, вы можете использовать метод .getCause () вашего исключения Unchecked.

void caller()
{
    try {
        foo();
    } catch (MyUncheckedException e) {
        CheckedException1 ce1 = e.getCause();
        ce1.printStackTrace();
    }
}

... но поскольку исключение из foo () не проверено, у вас нет для его обработки или объявления "throws".

Что касается лесозаготовок, по этому поводу существуют разные школы мысли.

  1. Записать его при возникновении исключения (низкий уровень)
  2. Записать, когда достигнет вершины (высокий уровень)
  3. Записывайте его, когда у вас достаточно информации для выполнения соответствующего действия и / или сообщения журнала. (средний уровень)

Хорошая политика, которую я нашел, - это установить обработчик необработанных исключений, который позаботится обо всех необработанных (явно не проверенных) исключениях. Таким образом, все пропущенное будет зарегистрировано и, возможно, обработано до сбоя системы.

public class MyExceptionHandler implements UncaughtExceptionHandler 
{       
    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
        ex.printStackTrace();
    }
}

// In your high-level code
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());

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

10 голосов
/ 27 сентября 2010

Способ обработки исключения зависит от исключения.Если исключение - это то, что вы не можете восстановить, и пользователь должен знать о нем, вы можете перехватить исключение и показать его в AlertDialog:

try {
  // do something
} catch (SomeImportantException e) {
  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  builder.setMessage("User friendly text explaining what went wrong.");
  AlertDialog alert = builder.create();
  alert.show();
}

Для получения дополнительной информации об этом диалоге см. создание диалогов .

В качестве альтернативы, если исключение - это то, с чем вы можете иметь дело, вы можете просто зарегистрировать информацию об исключении и двигаться дальше.

try {
  // do something
} catch (SomeLessImportantException e) {
  Log.d(tag, "Failed to do something: " + e.getMessage());
}
0 голосов
/ 18 июля 2011

Вы можете использовать плагин ACRA, который предлагает эту функцию, или BugSense для сбора отчетов об ошибках.Отказ от ответственности: я основатель в BugSense.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...