2

次のようなコードがあります (Java ブラケット スタイルで申し訳ありません)。

class SomeClass {
   public static void doSomethingRisky() {
        try {
          SomeRiskyFunction();
        } catch (Exception e) {
          throw e;
        }
   }
}

class MainClass {
   public void callSomethingRisky() {
        try {
          SomeClass.doSomethingRisky();
        } catch (Exception e) {
          FinallyHandleTheException(e);
        }
   }
}

基本的にSomeClassはライブラリであり、すべての例外が呼び出し側プログラムによって処理されるように設計したいと考えています (例外に関するメッセージを表示することを選択する場合としない場合があります)。

try/catch&throw私の質問は、doSomethingRisky()fromでの の使用についてSomeClassです。それは冗長ですか、それとも必要ですか?つまり、それをオフのままにし、関数が実行時に例外に遭遇した場合、その関数内で何も例外をキャッチしないため、プログラムがクラッシュしますか、それともcallSomethingRisky()正常に処理される呼び出し元 ( ) に渡しますか?

Javaについても同じ質問です。ありがとう!

4

3 に答える 3

17

try/ catchwith throw e;inは、まさに 1 つのdoSomethingRiskyことを行います: スタック トレース情報を破棄します。それはおそらくあなたが望んでいたものではないので、try/catchを削除する必要があります - 期待どおりにすでにバブルアップしています。

参考までに、それがthrow;(ではなくthrow e;)ただの場合、破壊的ではなく、単に冗長になります。

于 2013-06-21T12:26:06.953 に答える
4

両方の方法で呼び出し元に渡されます。
上に示した構文の使用法の 1 つは、例外をプロシージャーに記録することですが、例外を処理できるようにコール スタックのどこかで例外をスローすることcatchです。

留意すべき 1 つの点は、スタック トレース情報が失われないようにするthrow代わりに、この状況で使用することです。throw e

于 2013-06-21T12:26:03.513 に答える
2

あなたの場合、それは冗長です。多くの場合、開発者は例外にさらに情報を追加するか、元の例外を内部例外として埋め込んで新しい例外を作成します。しかし、単純にキャッチして再スローするのは冗長です。

于 2013-06-21T12:25:59.200 に答える