Ich habe an einer Android-App gearbeitet, die try/catch
häufig verwendet wird, um zu verhindern, dass sie selbst an Orten abstürzt, an denen keine Notwendigkeit besteht. Zum Beispiel,
Eine Ansicht in xml layout
mit id = toolbar
wird wie folgt referenziert:
// see new example below, this one is just confusing
// it seems like I am asking about empty try/catch
try {
View view = findViewById(R.id.toolbar);
}
catch(Exception e) {
}
Dieser Ansatz wird in der gesamten App verwendet. Die Stapelverfolgung wird nicht gedruckt und es ist wirklich schwer zu finden, was schief gelaufen ist. Die App wird plötzlich geschlossen, ohne dass eine Stapelverfolgung gedruckt werden muss.
Ich bat meinen Senior, es mir zu erklären, und er sagte:
Dies dient dazu, Abstürze in der Produktion zu verhindern.
Ich bin damit überhaupt nicht einverstanden . Für mich ist dies nicht der Weg, um Apps vor Abstürzen zu schützen. Es zeigt, dass der Entwickler nicht weiß, was er tut, und Zweifel hat.
Wird dieser Ansatz in der Industrie verwendet, um Abstürze von Unternehmensanwendungen zu verhindern?
Wenn try/catch
es wirklich, wirklich unser Bedürfnis ist, ist es dann möglich, einen Ausnahmebehandler mit UI-Thread oder anderen Threads anzuhängen und dort alles abzufangen? Das wird nach Möglichkeit ein besserer Ansatz sein.
Ja, leer try/catch
ist schlecht, und selbst wenn wir eine Stapelverfolgung oder eine Protokollausnahme auf dem Server drucken try/catch
, ist es für mich nicht sinnvoll , Codeblöcke zufällig über die gesamte App zu verpacken , z. B. wenn jede Funktion in a eingeschlossen ist try/catch
.
AKTUALISIEREN
Da diese Frage viel Aufmerksamkeit erhalten hat und einige Leute die Frage falsch interpretiert haben (vielleicht weil ich sie nicht klar formuliert habe), werde ich sie umformulieren.
Hier ist, was Entwickler hier tun
Eine Funktion wird geschrieben und getestet . Es kann sich um eine kleine Funktion handeln, die nur Ansichten initialisiert, oder um eine komplexe Funktion. Nach dem Testen wird sie um einen
try/catch
Block gewickelt . Auch für Funktionen, die niemals eine Ausnahme auslösen.Diese Vorgehensweise wird in der gesamten Anwendung angewendet. Manchmal wird eine Stapelverfolgung gedruckt und manchmal nur eine
debug log
zufällige Fehlermeldung. Diese Fehlermeldung unterscheidet sich von Entwickler zu Entwickler.Bei diesem Ansatz stürzt die App nicht ab, aber das Verhalten der App wird unbestimmt. Selbst manchmal ist es schwer zu verfolgen, was schief gelaufen ist.
Die eigentliche Frage, die ich gestellt habe, war: Ist es in der Branche üblich, zu verhindern, dass Unternehmensanwendungen abstürzen? und ich frage nicht nach leerem try / catch . Ist es so, dass Benutzer Anwendungen lieben, die nicht abstürzen, als Anwendungen, die sich unerwartet verhalten? Weil es wirklich darauf ankommt, es entweder zum Absturz zu bringen oder dem Benutzer einen leeren Bildschirm anzuzeigen oder das Verhalten des Benutzers nicht zu bemerken.
Ich poste hier ein paar Ausschnitte aus dem echten Code
private void makeRequestForForgetPassword() { try { HashMap<String, Object> params = new HashMap<>(); String email= CurrentUserData.msisdn; params.put("email", "blabla"); params.put("new_password", password); NetworkProcess networkProcessForgetStep = new NetworkProcess( serviceCallListenerForgotPasswordStep, ForgotPassword.this); networkProcessForgetStep.serviceProcessing(params, Constants.API_FORGOT_PASSWORD); } catch (Exception e) { e.printStackTrace(); } } private void languagePopUpDialog(View view) { try { PopupWindow popupwindow_obj = popupDisplay(); popupwindow_obj.showAsDropDown(view, -50, 0); } catch (Exception e) { e.printStackTrace(); } } void reloadActivity() { try { onCreateProcess(); } catch (Exception e) { } }
Es handelt sich nicht um ein Duplikat der Best Practices für die Behandlung von Android-Ausnahmen . Dort versucht OP, Ausnahmen für einen anderen Zweck als diese Frage abzufangen.
catch(Exception e){}
- dieser Kommentar machte vor der Bearbeitung der Frage Sinn