Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I stop my application from zombifying after I handle an uncaught Excepition?

I am handling any uncaught exceptions that occur in my application via:

Thread.setDefaultUncaughtExceptionHandler(this);

were this is my launcher Activity implementing UncaughtExceptionListener. I handle the exception and send it off to my log server just fine, however, my application then doesn't end. It just runs along as a zombie until the home or back button is pressed. How can I kill the process after handling the exception?

Edit
Here is a test and working activity that throws an uncaught exception that is to be caught (by Thread) and handled. The toast is never posted and the process goes zombie once the exception is logged.

class TestActivity extends Activity implements UncaughtExceptionListener {

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Thread.setDefaultUncaughtExceptionHandler(this);
        throw new RuntimeException("I'm a destuctive booger.");

        setContentView(R.layout.activity_test);
    }

    @Override public void uncaughtException(Thread thread, Throwable toss) {
        Log.e(TAG, "An uncaught exception has been recieved.", toss);
        Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show();
    }
}
like image 700
ahodder Avatar asked Apr 05 '12 18:04

ahodder


1 Answers

I did some testing with your example code and discovered that finish() will work from uncaughtException(). It's silent however so doesn't give any feedback to the user and, like you, I was unable to invoke a Toast or any other visual message box even using getApplicationContext().

The only way of sending any feedback that I was able to get working was to use NotificationManager to send a status bar Notification using getApplicationContext() for the Context.

I didn't spend much time on it but unfortunately it seems this does mean having to provide a PendingIntent to handle when a user clicks on the notification itself. Doing this with the same Activity could obviously risk an infinite loop if the Activity set for the PendingIntent is one which generates an unhandled exception.

It would be possible, however, to create a vary basic Activity perhaps with a dialog theme that would be opened and explain the crash.

like image 173
Squonk Avatar answered Oct 19 '22 23:10

Squonk