1. ホーム
  2. java

[解決済み] なぜJavaの人は例外を黙って消費することが多いのか?

2023-07-28 08:29:06

疑問点

私はこれまで本格的なJavaコーディングをしたことはありませんが、構文、ライブラリ、およびコンセプトは、私の既存のスキル (Delphi & C#) に基づいて学びました。 私がほとんど理解していないことの 1 つは、例外を静かに消費する多くのコードを 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を削除して を完全に . 私は単に未処理のアカとして再スローします。 RuntimeException (あるいは、さらに良いことに AssertionError ) で、最も適切な場所、つまりフレームワークの一番外側のループでそれをキャッチしてログに記録します。

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

どのように解決するのですか?

私は常々、次のようなシナリオに類似していると考えています。

ある男が撃たれた。

彼は息を止め、バスに乗るだけの力を持っています。

10マイル後、男はバスを降り、2ブロックほど歩いて、死んだ。

警察が死体を発見したとき、何が起こったのか手がかりがない。いずれはそうなるかもしれませんが、それはずっと難しいことです。

より良いのは

<ブロッククオート

"男が撃たれ、彼は即死し、死体はちょうど殺人が起こった場所に横たわっています。

警察が到着すると、すべての証拠が揃っている。

システムが故障するならば、より良いのは 早く故障する

質問に対応する。

  1. 無知であること
      +
  2. ナマケモノ
  3. EDITです。

    もちろん、キャッチの部分は便利です。

    例外で何かができるのであれば、そこで行うべきでしょう。

    おそらくそれは与えられたコードのための例外ではなく、おそらくそれは期待されたものです(私の例えでは防弾チョッキのようなもので、男は最初の場所で撃たれるのを待っていたのです)。

    そして、そうです、catchは 抽象化に適した例外を投げる