Catch all type exceptions для программирования Android

Я разрабатываю приложение для ОС Android. Поскольку это мое первое приложение, я думаю, что совершил некоторые ошибки в программировании, потому что я вряд ли могу отследить ошибки до их причин. Таким образом, я догадывался, в то время как я пытаюсь исправить ошибки, есть ли способ поймать ВСЕ типы исключений в моем жизненном цикле деятельности с одним try-catch?

Это было бы потрясающе, мне стало скучно смотреть, как моя галактика S говорит: "Извините приложение приложение прекратило небывало": (

Ответы

Ответ 1

Я действительно, действительно не рекомендую это...

try {
     ...
} catch (Exception e) {
     // This will catch any exception, because they are all descended from Exception
}

Вы просматриваете трассировки стека, чтобы отлаживать свои проблемы? Их не должно быть сложно отследить. Посмотрите на LogCat и просмотрите большой блок красного текста, чтобы узнать, какой метод вызвал ваш сбой и какова была ваша ошибка.

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

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

Ответ 3

Если вы работаете в Eclipse, каждое исключение, которое принудительно закрывает приложение (ака сообщенное вами сообщение), должно быть зарегистрировано в "LogCat".

Самый простой способ увидеть LogCat - открыть перспективу DDMS и кликнуть на вкладке LogCat (или открыть ее из меню "Вид", если она еще не отображается).

Ответ 4

import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;

public class SRSDexception implements Thread.UncaughtExceptionHandler {

private Thread.UncaughtExceptionHandler defaultUEH;

private Activity app = null;

public SRSDexception(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    this.app = app;

}

public void uncaughtException(Thread t, Throwable e) 
{   

StackTraceElement[] arr = e.getStackTrace();
String Raghav =t.toString();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n"+Raghav;
for (int i=0; i<arr.length; i++)
{
report += "    "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";

// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++)
{
report += "    "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";

try {
FileOutputStream trace = app.openFileOutput(
"stack.trace", Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}

defaultUEH.uncaughtException(t, e);
}

}