Лучшая практика обработки исключений для Android?

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

try {
    // ... 
} catch(Exception e) { 
    // ...
} 

И создайте новый Activity, который объяснит, что приложение мгновенно сработало (а также предоставило пользователям возможность отправлять почту с данными об ошибках) вместо того, чтобы задержать эту задержку благодаря Android. Есть ли лучшие методы достижения этого или это обескураживает?

Обновление: Я использую Nexus 5 с включенным АРТ, и я не замечаю задержку, с которой я столкнулся с сбоями приложений ( "зависание", о котором я говорил первоначально). Я думаю, так как теперь все есть собственный код, авария происходит мгновенно вместе с получением всей информации о сбоях. Возможно, Nexus 5 просто быстро:) несмотря на это, это может быть не беспокойство в будущих выпусках Android (учитывая, что ART будет исполняться по умолчанию в Android L).

Ответ 1

Здесь проверьте ссылку для справки.

Здесь вы создаете класс: ExceptionHandler, который implements java.lang.Thread.UncaughtExceptionHandler..

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

Теперь идет важная часть. То есть, как поймать это исключение. Хотя это очень просто. Скопируйте следующую строку кода в каждую вашу активность сразу после вызова метода super в методе override onCreate.

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

Ваша активность может выглядеть примерно так...

public class ForceClose extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

        setContentView(R.layout.main);
    }
}

Надеюсь, что это поможет...

Ответ 2

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

//******************************************
//some generic method
//******************************************
private void doStuff()
{       
    try
    {
        //do some stuff here
    }
    catch(Exception e)
    {
        messageBox("doStuff", e.getMessage());
    }
}


//*********************************************************
//generic dialog, takes in the method name and error message
//*********************************************************
private void messageBox(String method, String message)
{
    Log.d("EXCEPTION: " + method,  message);

    AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
    messageBox.setTitle(method);
    messageBox.setMessage(message);
    messageBox.setCancelable(false);
    messageBox.setNeutralButton("OK", null);
    messageBox.show();
}

Вы также можете добавить другие методы обработки ошибок в этот метод, например, printtttrace

Ответ 3

я нашел метод "wtf" (какой ужасный отказ) в классе журнала. Из описания:

В зависимости от конфигурации системы отчет может быть добавлен к DropBoxManager и/или процесс могут быть немедленно прекращены диалог ошибок.

http://developer.android.com/reference/android/util/Log.html

Надеюсь, это поможет кому-то