当前位置: 首页 > 面试题库 >

为什么Java人们经常默默地消费异常?

南门新荣
2023-03-14
问题内容

我以前从未进行过任何认真的Java编码,但是我根据现有技能(Delphi和C#)学习了语法,库和概念。我很难理解的一件事是,我看到如此多的代码在printStackTrace像这样的情况下无声地消耗了异常:

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

我遇到的几乎每个Java文章和项目中都有类似的代码。根据我的知识,这是非常糟糕的。几乎应该总是将异常转发给外部上下文,如下所示:

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
            throw new AssertionError(e);
        }
    }

在大多数情况下,异常应最终在属于底层框架(例如Java Swing)的最外层循环中进行处理。为什么在Java世界中看起来像这样的代码规范?我很困惑

根据我的背景,我希望 完全 删除printStackTrace 。我只是将其作为未处理的aka
RuntimeException(或者甚至更好AssertionError)扔掉,然后在最合适的位置捕获并记录它:框架最外层的循环。

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            throw new AssertionError(e);
        }
    }

问题答案:

我一直认为,这类似于以下情况:

“一个人被枪杀。

他屏住呼吸,有足够的力量坐公共汽车。

10英里后,该男子下车,走了两个街区,死了。”

当警察到达尸体时,他们对刚刚发生的事情一无所知。他们可能最终会拥有,但要困难得多。

更好的是:

“一个人被枪击后立即死亡,尸体正好在谋杀案发生的地方。”

警察到达时,所有证据均已到位。

如果系统要发生故障,最好是快速故障

解决问题:

  1. 无知。 +
  2. 懒惰

编辑:

当然,catch部分很有用。

如果可以做一些例外处理,那就应该这样做。

对于给定的代码,这可能不是一个例外,这可能是预料之中的事情(以我的类比,就像一件防弹夹克,而那个人一直在等待镜头)。

是的,可以使用catch来抛出适合于抽象的异常



 类似资料:
  • 在阅读https://developer.android.com/kotlin/coroutines时,我偶然发现了以下警告: 警告:启动和异步处理异常的方式不同。因为async希望最终调用在某个时刻等待,所以它保留异常并作为等待调用的一部分重新抛出它们。这意味着如果您使用await从常规函数启动新的coroutine,您可能会静默地删除异常。这些被删除的异常不会出现在崩溃度量中,也不会在Logc

  • 我看了一下Java8与7相比的新闻,除了lambdas或新的时间框架等非常有趣的东西之外,我发现一个新特性(?)介绍了:默认方法。 我在这篇文章中发现了以下示例: 在我看来很奇怪。上面的代码看起来像一个具有已实现方法的类。那么,为什么要在一个接口中引入默认方法呢?这种做法的实际好处是什么? 在同一篇文章中,我读到了这样的解释: 为什么要在接口中添加方法?这是因为接口与它们的实现类耦合得太紧了。即在

  • 在使用Spring Kafka Consumer时,我有时会收到以下错误消息。如代码片段所示,我至少实现了一次语义 1)我的疑问是,我是否错过了来自消费者的任何信息? 2) 我需要处理这个错误吗。由于 org.apache.kafka.clients.consumer.提交失败异常:无法完成偏移提交,因为消费者不是自动分区分配的活动组的一部分;消费者很可能被踢出组。 我的SpringKafka消费

  • Java中的本质上是不可靠的。具体地说,我对接口的最大问题是,它需要一个不定义方法本身的方法行为。因此,如果遍历一个列表,您必须使用反射来访问它定义的行为。然而,在Java8中,我们现在有了默认方法,现在我问为什么在中没有默认的方法。 我理解为什么接口不能默认对象方法,但是,这是一个明确的设计决定,所以可以做出例外。 我有点想弃用并将其内部代码更改为类似以下内容: 然后继续使用使作为中的默认方法的

  • 根据我读到的其他问题(为什么重写方法不能抛出比重写方法更广的异常?以及Java方法抛出异常) 我知道子类中的重写方法必须抛出在重写方法中抛出的异常的相同或一个子类。 Java方法总是至少抛出一个类型为exception的异常吗? ...换句话说,编译器添加抛出异常 因此类X将如下所示 我想澄清的是,对于始终添加默认异常处理程序异常这一事实,我没有搞错。 相关问题: IOException与Runt

  • 问题内容: 当返回的数据不是有效的JSON时,jQuery 静默失败似乎非常不便。为什么用无声失败来实现呢?用更好的故障行为(例如,引发异常或其他方法)执行getJSON的最简单方法是什么? 问题答案: 您可以使用 如果要查看错误原因,请使用完整版本 如果您的JSON格式不正确,则会看到类似 如果网址错误,您会看到类似 如果您试图从另一个域获取JSON,则违反Same-origin策略,则此方法将