Fehlerbehandlung -> Meldung "Leider wurde das programm...beendet" ändern

N

newpageart

Neues Mitglied
0
Schönen guten morgen,
ich versuche gerade eine Fehlerausgabe für den Benutzer zu erstellen, da standardmäßig immer nur der gleiche Dialog angezeigt wird (Dialog "Leider wurde das programm...beendet"). Leider hat dieser keine richtig Aussagekraft, da daraus der Gund des Fehlers nicht ersichtlich wird. Ich habe deshalb eine eigene Ausgabe in den "catch"-Zeig einbauen, aber leider hat diese keine Auswirkung. Es wird weiterhin der Standard-Dialog/Text angezeigt und die neue Meldung wird einfach ignoriert. Muss ich noch irgendetwas anderes dabei beachten?
Hier mein bisheriger Versuch:
Code:
} catch (Exception e) {
      Log.e("Test", "ERROR -> Exception");       
      Toast toast = Toast.makeText(this, "Folgender Fehler ist aufgetreten: "+e.getMessage(), Toast.LENGTH_SHORT);
      toast.show();
      e.printStackTrace();
}

Viele Grüße,
Tom
 
Warum möchtest du einem User ganz genau angeben was da schiefgelaufen sein soll?

Das und dann passiert die Exception wohl nicht im Try Block bzw. evtl. wird sogar ein Error geworfen!
 
Hallo Jaiel,
vielen Dank für deine Antwort.
Der Benutzer braucht nichrt unbedingt eine detailierte Angabe zu dem Fehler, aber eine Aussagekräftigere meldung wäre schon schön. Bsp.: "Beim erstellen der Datei ist ein Fehler aufgetretten".
Die Exception passiert in diesem Block und die Zeile "Log.e("Test", "ERROR -> Exception");" wird auch in der Logcat ausgegeben. Allerdings wird dann Toast ignoriert.
Viele Grüße,
Tom
 
Hallo,
vorweg der Hinweis, dass es nicht Guideline-konform ist dem Nutzer "spezielle" technische Informationen über die App mitzuteilen...
Und hier eine Möglichkeit (beachte, dass durch die Einflussnahme auf den ExceptionHandler es an anderen Programmstellen zu unerwarteten Abläufen kommen kann - oder einfach formuliert: manchmal ist es hilfreicher, dass der Nutzer aus der App geworfen wird, als dass er in einem Zustand verharrt, in dem womöglich wichtige Programmteile falsch bzw. uninitialisiert sind und ggf. auch bleiben):

Code:
public class MainActivity extends ActionBarActivity {


    private String TAG = "MainActivity";
  
    private TextView tvNullPtr;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d(TAG, "onCreate ");

        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, final Throwable ex) {
                Log.e(TAG, "Error in uncaughtException - Msg: " + ex.getMessage() + "  ");
            }
        });
    }


    public void onClickNullPtr(View view) {
        try {
            tvNullPtr.setText("");
        } catch (Exception e) {
            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Hinweis")
                    .setMessage("Ein Fehler trat auf.")
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    })
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();
        }

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

}


Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">
  
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="NULLPTR"
        android:id="@+id/button"
        android:onClick="onClickNullPtr"
        android:layout_alignParentTop="false"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="32dp"/>

</RelativeLayout>
 
Mmmmh okay...
Es wird aber vom Mainthread aus aufgerufen oder? Wenn nicht mal in einen runonuithread packen.

vllt e.printstacktrace zuerst callen ...
 
NACHTRAG:
um beschriebene Problematik zu lösen könnte in den ButtonCallback noch ein System.exit(int) übergeben.
 
newpageart schrieb:
Bsp.: "Beim erstellen der Datei ist ein Fehler aufgetretten".

Bei "erwarteten" Fehlern wie so etwas ist es aber extrem unschön die ganze App crashen zu lassen. (Unabhängig davon dem User mitzuteilen wieso)
Bei sowas reicht es doch das korrekt abzufangen und dem User per Snackbar/Toast/Dialog eine entsprechende Meldung zu geben.
Wenn das bei dir nicht klappt machst du was falsch. Der App Crash sollte nur passieren wenn was von dir vollkommen unvorhergesehens passiert und nicht die Regel sein. Ein bisschen ordentliches Error Handling sollte man als Entwickler schon machen.
 
Naja... mit einem einfachen try... catch.. wird ein Nullptr auf meinen Testgeräten nicht abgefangen und ich glaube darum ging es ja vordergründig bei der Frage des TEs
 
Also ich sag mal so. ...

Exceptions sollten auf jeden Fall abgefangen werden und behandelt wenn möglich. Da braucht das Programm nicht abstürzen --> Stichwort: Robustheit von Programmen.

Wie dem auch sei können Errors passieren und diese sollten auf keinen Fall abgefangen werden sondern sofort zum Absturz des Programms führen.
Das sind dann auch häufig die Sachen die du nicht vorhersehen kannst. Ausnahme OutOfMemory Exception da braucht deine App dann nicht weiter laufen bzw. sollte die Activity neu gestartet werden und falls es an den assets liegt sollten weniger hochauflösende Bitmaps oder audio Dateien geladen werden.

Der Sinn jetzt dem User mitzuteilen warum es abgestürzt ist ergibt sich mir nicht aber gib doch einfach aus "Die App wurde aus unvorhergesehenen Umständen leider beendet" und versuche sofort einen Neustart.

Du hast meine Frage nicht beantwortet ob der Toast auf dem MainThread ausgeführt wird...
 
Hallo alle zusammen,
vielen Dank für eure Antworten und Tips.
Eine genau Ausgabe des Fehlers ist auch nicht nötig. Ich wollte nur nicht die Standardfehlermeldung angezeigt bekommen. Scheinbar war auch genau diese Fehlerausgabe das eigentlich Problem. Nach dem ich die Ausgabe von "e.getMessage()" entfernt hatte, wird der Toast auch angezeigt. Das Problem ist also gelöst :) Vielen Dank!
 

Ähnliche Themen

D
Antworten
14
Aufrufe
1.731
chrs267
chrs267
C
  • Chicken Wing
Antworten
4
Aufrufe
872
Chicken Wing
C
K
Antworten
1
Aufrufe
811
swa00
swa00
Zurück
Oben Unten