7

重複の可能性:
throw と throw new Exception() の違い

私は、レガシー コードに新しい機能を追加する作業をしているプログラマーです。デバッグ中に、この Catch ブロックを解析すると、Visual Studio から「オブジェクトがオブジェクトの参照に設定されていません」という警告が表示されました。

catch(Exception ex)
            {
                SporeLog.Log("Failed to create new SavedDocumentList with Name: " + name, ex);
                throw;
            }

「投げる」とはどういう意味ですか。私はよく知ってthrow new [exceptiontype]...いますが、単に... とはどういう意味throwですか?

これは良い習慣ですか、それとも私の後の開発者の試用を容易にするためにこのコードを変更する必要がありますか?

Visual Studio がこれを行うと怒鳴るのはなぜですか?

4

4 に答える 4

12

はい、それは良い習慣です....それは、キャッチしたのと同じ例外を再スローし、スタックトレースをそのままに保ちます。

于 2010-07-21T16:34:37.350 に答える
9

これは、「この同じ例外を再スローする」ことを意味します。つまり、例外を次の try/catch ブロックまでバブルアップし続けます。

このレベルで例外を実際に処理できないが、例外が発生したことをログに記録したい場合に便利です。

残念なことに、多くの人は「ログと再スロー」はすべてのレベルで実行する必要があると考えており、アプリケーションの実行が遅くなり、すべての例外が複数回記録されたログ ファイルが作成され、多くの場合実際に例外を処理することはありません。

于 2010-07-21T16:33:51.793 に答える
3

これは良い習慣です (場合によっては)。これにより、例外をキャッチし、ログに記録するか、処理できるかどうかを判断してから、StackTrace を失うことなく例外を再スローできます。

あなたの NullReferenceException はSporeLogbeingから来ましたnull

于 2010-07-21T16:34:49.093 に答える
3

throw;元の例外を再スローします。これにより、現在のレベルで何らかのアクションを実行してから、例外をスタックに伝播できます。

例外が実装の詳細の結果である場合は、例外チェーンを使用して、元の例外をラップするドメイン固有の例外をスローし、クライアントを実装の詳細から隠し、キャッチするさまざまな例外タイプを使用する方が適切な場合があります。 .

例外がクライアントにとって意味がある場合は、例外を再スローすることをお勧めします。

于 2010-07-21T16:34:24.787 に答える