2010-09-27 5 views
9

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

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

ответ

10

Как вы обрабатываете исключение, зависит от исключения. Если исключение является то, что вы не можете оправиться от, и пользователь должен знать о том, то вы могли бы поймать исключение и показать его в 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(); 
} 

Для получения дополнительной информации о диалоге см creating dialogs.

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

try { 
    // do something 
} catch (SomeLessImportantException e) { 
    Log.d(tag, "Failed to do something: " + e.getMessage()); 
} 
+0

Хотя этот ответ является точным, ответ paiego ниже намного полезнее. – Gowiem

17

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

Исключено в основном исключение из 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(); 
    } 
} 

Переполнение исключения, полученное из java.lang.RuntimeException, не требует ни, что вы определяете «кидает» в вашем определении метода или что вы справиться с этим.

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

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

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

По этой причине, если вы будете осторожны, вы можете использовать Unchecked Exceptions.

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

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

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() является Неконтролируемым, вы не имеют обрабатывать его или объявить «кидает».

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

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

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

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

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

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

+1

Это ** легко ** лучшее объяснение, которое я прочитал об обработке исключений, что печально, потому что я искал поисковые запросы в течение часа или двух. Вы заслуживаете гораздо больше внимания сэр. – Gowiem

+0

Лучше всего вам, Gowie47! :) – paiego

+1

Благодарим вас за хороший пример того, как бороться с исключениями третьих лиц. – shadowhorst

0

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

Смежные вопросы