当前位置: 首页 > 知识库问答 >
问题:

使用try/catch防止应用程序崩溃

宗穆冉
2023-03-14
// 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) {
}

我让我的学长给我解释,他说,

这是为了防止生产中的崩溃。

我完全不同意。对我来说,这不是防止应用程序崩溃的方法。这表明开发人员不知道他/她在做什么,并有疑问。

由于这个问题得到了很多关注,有些人误解了这个问题(可能是因为我没有清楚地表达它),我打算重新表达它。

以下是开发人员在这里所做的

>

  • 编写并测试一个函数,它可以是一个只是初始化视图的小函数,也可以是一个复杂的函数,测试后它被包裹在try/catch块中。即使对于永远不会抛出任何异常的函数也是如此。

    我在这里发布了一些真实代码的片段

      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试图捕捉异常的目的不同于这个问题。

  • 共有1个答案

    轩辕晔
    2023-03-14

    当然,规则总有例外,但如果你需要一个经验法则--那么你是正确的;空的捕获块是“绝对”不好的做法。

    让我们仔细看一下,首先从您的具体示例开始:

    try {
      View view = findViewById(R.id.toolbar);
    }
    catch(Exception e) { }
    

    因此,创建了对某物的引用;当失败的时候...没关系;因为一开始就没有使用这个引用!上面的代码是绝对无用的行噪声。或者编写代码的人最初假设第二个类似的调用将神奇地不再抛出异常?!

    try {
      View view = findViewById(R.id.toolbar);
      ... and now do something with that view variable ...
    }
    catch(Exception e) { }
    
      null

    正如其他人所指出的那样:您还可以避免在一般情况下捕获异常(嗯,这取决于层:可能有很好的理由对异常进行捕获,甚至在最高级别捕获某些类型的错误,以确保没有丢失任何东西;永远)。

    最后,让我们引用沃德·坎宁安的话:

    当您读到的每个例程都与您所期望的差不多时,您就知道您正在使用干净的代码。当代码也使它看起来像是为问题而设计的语言时,你可以称之为美丽的代码。

    try {
      do something
    }
    catch(Exception e) { 
      print stacktrace
    }
    

    同样的答案:“到处都是”也是不好的做法。因为这段代码也让读者大吃一惊。

    以上所述:

    • 在某处打印错误信息。根本不能保证这个“某处”类似于一个合理的目的地。恰恰相反。示例:在我正在使用的应用程序中,这样的调用会神奇地出现在我们的跟踪缓冲区中。根据上下文,我们的应用程序有时可能会将数吨的数据泵入这些缓冲区;使这些缓冲区每隔几秒钟修剪一次。因此,“只是打印错误”通常会转化为:“只是丢失所有此类错误信息”。
    • 然后:你不做尝试/捕捉,因为你可以。你这样做是因为你明白你的代码在做什么;你知道:我最好尝试一下/抓住这里来做正确的事情(请再看我答案的第一部分)。
     类似资料:
    • 问题内容: 我一直在开发一个Android应用程序,该应用程序经常使用以防止它崩溃,即使在不需要的地方也是如此。例如, 在视图与被引用,如: 在整个应用程序中都使用这种方法。堆栈跟踪没有打印出来,很难找到问题所在。该应用程序突然关闭而不打印任何堆栈跟踪。 我请我的长辈向我解释一下,他说: 这是为了防止生产崩溃。 我完全不同意 。对我来说,这不是防止应用程序崩溃的方法。它表明开发人员 不 知道自己在

    • 即使在谷歌搜索了几个小时后,我也无法找出确切的问题。我已经检查了StackOverflow本身的几个答案,但未能找出问题所在。 错误跟踪如下: 主要活动代码: 更新1:我已经做了答案中建议的所有更改,但每当我单击MainActivity中的“跳过指令”按钮时,我的应用程序仍然崩溃。此外,当我从AdminLogin活动中单击“登录”按钮时,应用程序崩溃。我该怎么办? Update2:我提到了什么是N

    • 我正在登录页面上工作,基于Androidhive教程和问题是在2布局下工作正常,但对于3布局应用程序将崩溃。 在androidhive教程中使用了2布局,但我想使用3,因为我收到短信然后otp然后注册,所以问题是3rd布局,它不会出现并崩溃。 Androidhive教程链接:第1部分第2部分 以下是代码: XML Java Logcat 08-29 10:48:12.426 4499-4499/i

    • 问题内容: 好的,这可能是一个非常愚蠢的问题,但是我发现关于此的PHP文档以及一些Internet搜索并没有使我对此有所任何了解。 什么时候应该使用try-catch块来改进我的应用程序? 我读过有人说我们应该仅使用try- catch块来防止致命错误。我读过别人的话说,我们应该只在意外错误上使用它(等什么?意外?如果它们是意外错误,如何使用try- catch防止它们出现?我应该将所有应用程序代

    • 问题内容: 我的应用程序中的函数出现崩溃(来自Crashlytics,无法在本地重现): 由于我自己无法重现此错误,并且无法使用CoordinatorLayouts进行6个活动,因此如何进行调试? 编辑 :看起来它将在下一个支持库版本中修复 问题答案: 我遇到了类似的问题,因此降级到较旧的Android支持库版本(v24.1.1)对我来说很有用。库中似乎有问题,您可以在此处查看 Android I