Pracowałem nad aplikacją na Androida, która try/catch
często używa, aby zapobiec awariom nawet w miejscach, w których nie ma takiej potrzeby. Na przykład,
Do widoku w xml layout
z id = toolbar
odwołuje się:
// 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) {
}
To podejście jest używane w całej aplikacji. Ślad stosu nie jest drukowany i naprawdę trudno jest stwierdzić, co poszło nie tak. Aplikacja zamyka się nagle bez drukowania śladu stosu.
Poprosiłem seniora, żeby mi to wyjaśnił, a on powiedział:
Ma to na celu zapobieganie awariom w produkcji.
Całkowicie się z tym nie zgadzam . Dla mnie nie jest to sposób na zapobieganie awariom aplikacji. Pokazuje, że programista nie wie, co robi i ma wątpliwości.
Czy jest to podejście stosowane w przemyśle w celu zapobiegania awariom aplikacji korporacyjnych?
Jeśli try/catch
tak, naprawdę potrzebujemy, to czy możliwe jest dołączenie procedury obsługi wyjątków z wątkiem interfejsu użytkownika lub innymi wątkami i przechwycenie tam wszystkiego? Jeśli to możliwe, będzie to lepsze podejście.
Tak, puste try/catch
jest złe i nawet jeśli drukujemy ślad stosu lub rejestrujemy wyjątek na serwerze, try/catch
losowe zawijanie bloków kodu w całej aplikacji nie ma dla mnie sensu, np. Gdy każda funkcja jest ujęta w try/catch
.
AKTUALIZACJA
Ponieważ pytanie to wzbudziło wiele uwagi, a niektórzy błędnie je zinterpretowali (być może dlatego, że nie sformułowałem go jasno), zamierzam je przeformułować.
Oto, co robią tutaj programiści
Funkcja jest pisana i testowana , może to być mała funkcja, która po prostu inicjuje widoki lub złożona, po przetestowaniu jest zawijana wokół
try/catch
bloku. Nawet dla funkcji, która nigdy nie zgłosi żadnego wyjątku.Ta praktyka jest stosowana w całej aplikacji. Czasami drukowany jest ślad stosu, a czasami tylko
debug log
z przypadkowym komunikatem o błędzie. Ten komunikat o błędzie różni się w zależności od programisty.Dzięki takiemu podejściu aplikacja nie ulega awarii, ale zachowanie aplikacji staje się nieokreślone. Nawet czasami trudno jest śledzić, co poszło nie tak.
Prawdziwe pytanie, które zadawałem, brzmiało; Czy jest to praktyka stosowana w branży w celu zapobiegania awariom aplikacji korporacyjnych? i nie pytam o puste try / catch . Czy to tak, że użytkownicy uwielbiają aplikacje, które nie ulegają awarii niż aplikacje, które zachowują się nieoczekiwanie? Ponieważ tak naprawdę sprowadza się to do awarii lub pokazania użytkownikowi pustego ekranu lub zachowania, którego użytkownik nie jest świadomy.
Wstawiam tutaj kilka fragmentów prawdziwego kodu
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) { } }
To nie jest duplikat najlepszych praktyk w zakresie obsługi wyjątków Androida , OP próbuje złapać wyjątek w innym celu niż to pytanie.
catch(Exception e){}
- ten komentarz miał sens przed edycją pytania