Best Practice für die Behandlung von Android-Ausnahmen?

77

Wenn meine App abstürzt, bleibt sie einige Sekunden lang hängen, bevor Android mir mitteilt, dass die App abgestürzt ist und geschlossen werden muss. Also dachte ich daran, alle Ausnahmen in meiner App mit einem allgemeinen zu erfassen:

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

Und machen Sie eine neue Activity, die erklärt, dass die Anwendung sofort abgestürzt ist (und den Benutzern auch die Möglichkeit gibt, eine E-Mail mit den Fehlerdetails zu senden), anstatt diese Verzögerung dank Android zu haben. Gibt es bessere Methoden, um dies zu erreichen, oder wird davon abgeraten?

Update: Ich verwende ein Nexus 5 mit aktiviertem ART und bemerke nicht die Verzögerung, die ich beim Absturz von Apps hatte (das "Hängen", von dem ich ursprünglich gesprochen habe). Ich denke, da jetzt alles nativer Code ist, geschieht der Absturz sofort zusammen mit dem Abrufen aller Absturzinformationen. Vielleicht ist das Nexus 5 nur schnell :) Unabhängig davon ist dies in zukünftigen Versionen von Android möglicherweise kein Problem (da ART die Standardlaufzeit in Android L sein wird).

ldam
quelle
1
Bitte überprüfen Sie den Link
CRUSADER
Wenn ein Absturz auftritt, wird Ihre Aktivität zerstört, sodass Sie den Absturz nicht selbst behandeln können.
Raghunandan
@Raghunandan ja, aber wenn der Absturz aufgrund einer nicht behandelten Ausnahme auftritt, können Sie einen allgemeinen Catch-All-Exception-Handler verwenden und verhindern, dass er vollständig abstürzt.
ldam
@LoganDam Hast du jemals etwas herausgefunden?
Theblang
@mattblang Ich habe meine Android-Sachen schon eine ganze Weile nicht mehr angefasst, die Arbeit war verrückt. Könnte aber bald wieder in die Android-Welt zurückkehren. Die Option von CRUSADER scheint der Weg zu sein, den ich von meiner Lektüre genommen habe.
ldam

Antworten:

102

Suchen Sie hier nach dem Link als Referenz .

Hier erstellen Sie eine Klasse namens ExceptionHandler , die implements java.lang.Thread.UncaughtExceptionHandler..

In dieser Klasse erledigen Sie Ihre lebensrettenden Aufgaben wie das Erstellen von Stacktrace und das Hochladen von Fehlerberichten usw.

Jetzt kommt der wichtige Teil, dh wie man diese Ausnahme fängt. Obwohl es sehr einfach ist. Kopieren Sie die folgende Codezeile in jede Aktivität direkt nach dem Aufruf der Super-Methode in Ihre Overriden- onCreateMethode.

Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));

Ihre Aktivität könnte ungefähr so ​​aussehen ...

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);
    }
}

Hoffe das hilft...

KREUZRITTER
quelle
Ihre Beispielaktivität wird nicht implementiert UncaughtExceptionHandler:) Vielen Dank für die Antwort. Ich werde es versuchen, wenn ich von der Arbeit nach Hause komme.
ldam
Sollte auch Thread.setDefaultUncaughtExceptionHandler()nicht in Ihre Haupt- / Erstaktivität aufgenommen werden, damit alle Ausnahmen innerhalb der Anwendung behandelt werden?
ldam
Ich sagte, um eine Klasse zu erstellen, sagen wir, ExceptionHandler implementiert java.lang.Thread.UncaughtExceptionHandler .... Und fügen Sie dann in Ihren normalen Aktivitäten die oben genannte Codezeile hinzu ... Bitte beziehen Sie sich auf den oben genannten Link, um eine umfassendere Vorstellung zu erhalten ..
CRUSADER
@CRUSADER Vielen Dank, dass der Link, den Sie als Referenzlink erwähnt haben, einwandfrei funktioniert.
Ahmad Arslan
8
Oder fügen Sie diese Zeile einfach einmal zu einer BaseActivity hinzu und unterteilen Sie diese Aktivität in Ihrer gesamten App.
WKS
9

Sie können einfach einen allgemeinen Warndialog verwenden, um schnell Fehlermeldungen anzuzeigen. Zum Beispiel...

//******************************************
//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();
}

Sie können dieser Methode auch andere Optionen zur Fehlerbehandlung hinzufügen, z. B. die Stapelverfolgung drucken

Louis Evans
quelle
wahrscheinlich sollten Sie die Fehlermeldung verarbeiten, bevor Sie sie den Benutzern zeigen
Hyäne
4

Ich fand die "wtf" -Methode (was für ein schrecklicher Fehler) in der Log-Klasse. Aus der Beschreibung:

Abhängig von der Systemkonfiguration kann dem DropBoxManager ein Bericht hinzugefügt werden und / oder der Prozess kann sofort mit einem Fehlerdialog beendet werden.

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

Hoffe das hilft jemandem

Sunyata
quelle