使用 try/catch 来防止应用崩溃
我一直在开发一个Android应用程序,该应用程序经常使用以防止即使在不需要的地方也会崩溃。例如try/catch
中的视图的引用方式如下:xml layout
id = toolbar
// 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) {
}
此方法在整个应用中使用。堆栈跟踪未打印,很难找到出错的地方。应用程序突然关闭,而不打印任何堆栈跟踪。
我让我的学长向我解释,他说:
这是为了防止生产中崩溃。
我完全不同意。对我来说,这不是防止应用程序崩溃的方法。这表明开发人员不知道他/她在做什么,并且有疑问。
这是工业中用于防止企业应用程序崩溃的方法吗?
如果真的是我们的需要,那么是否有可能将异常处理程序与UI线程或其他线程附加并捕获所有内容?如果可能的话,这将是一个更好的方法。try/catch
是的,空是不好的,即使我们将堆栈跟踪或日志异常打印到服务器,在所有应用程序中随机包装代码块对我来说也没有意义,例如,当每个函数都包含在.try/catch
try/catch
try/catch
更新
由于这个问题引起了很多关注,有些人误解了这个问题(也许是因为我没有清楚地表达出来),我将重新措辞。
以下是开发人员在这里所做的工作
一个函数是编写和测试的,它可以是一个只是初始化视图的小函数,也可以是一个复杂的函数,在测试之后它被包裹在块周围。即使对于永远不会引发任何异常的函数也是如此。
try/catch
这种做法在整个应用程序中使用。有时打印堆栈跟踪,有时只是一些随机错误消息。此错误消息因开发人员而异。
debug log
使用此方法,应用不会崩溃,但应用的行为变得不确定。即使有时也很难跟踪出了什么问题。
我一直在问的真正问题是;业界是否遵循防止企业应用程序崩溃的做法?我不是在问空尝试/捕获。是不是像用户喜欢不崩溃的应用程序而不是行为异常的应用程序?因为它实际上归结为要么崩溃它,要么向用户呈现空白屏幕或用户不知道的行为。
-
我在这里发布一些来自真实代码的片段
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) { } }
它不是Android异常处理最佳实践的重复,OP试图为与此问题不同的目的捕获异常。