1

try-catchブロックが処理されたときに、それでもエラーがスローされるのはなぜですか?

例外の詳細:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

              Try
    Here >> :   _MemoryStream.Seek(6 * StartOffset, 0)
                _MemoryStream.Read(_Buffer, 0, 6)
              Catch ex As IOException
                // Handle Error
              End Try

編集:余分な情報を削除するために質問をクリーンアップしました。

4

8 に答える 8

6

アプリケーションは、try-catchブロック内の行で爆発しています。なぜこれが起こるのか考えていますか?黙って失敗するだけではいけませんか?

try / catch内で例外が発生しないと思うのはなぜですか?try.catchブロックの全体的な目的は、例外的な状況をどのように処理するかを定義することです。スローされた例外のタイプに対応するcatchブロックがない場合、例外は、何らかのコードがそれをキャッチするか、未処理として発生するまで伝播します。

もちろん、Catch ex as Exceptionすべての例外をキャッチしてそれらを飲み込むためのブロックとして使用することは可能ですが、これが良い考えになることはめったにありません。

限りでNullReferenceExceptionは、それらをキャッチして処理することはほとんどありません(ほとんどありません)。これらは通常、コードのどこかにバグがあり、ロジックが参照のnullメソッドやプロパティにアクセスする前に参照をテストしていないことを示しています。実際、_MemoryStream変数自体が原因である可能性があります。変数がnullの場合、変数の呼び出しを呼び出すと、その正確な例外が発生します。

于 2010-04-23T19:48:15.703 に答える
6

try/catchブロックはをキャッチするだけなので、IOExceptionをトラップしませんNullReferenceException

これは、投稿したコード以外のプログラムの何らかの論理エラーを示している可能性があります。そして、記録のために、この種の例外を除いて、プログラムは黙って失敗するべきではありません-それはおそらくコードまたはライブラリの使用方法(おそらくライブラリによって処理されるべきでしたが)のバグであり、ランタイム環境の問題。

于 2010-04-23T19:48:28.263 に答える
1
  1. トライキャッチは、一般的に黙って失敗することではありません。それを片付けるためだけに。

  2. コードのその時点で_MemoryStreamnull(または)はありますか?Nothingtry-catchは、実際にはを処理するために使用しないでくださいNullReferenceException
    この場合、aは。ではないNullReferenceExceptionため、キャッチされません。NullReferenceExceptionIOException

于 2010-04-23T19:48:59.573 に答える
1

これは、System.IOExceptionタイプの例外のみをキャッチしており、スローされる例外がSystem.NullReferenceExceptionであるために発生しています。それをキャッチするには、これを行う必要があります:

Try
   _MemoryStream.Seek(6 * StartOffset, 0)
   _MemoryStream.Read(_Buffer, 0, 6)
Catch ex As IOException

Catch ex As NullReferenceException
   ' Exception would be caught and handled here.
End Try
于 2010-04-23T19:49:12.437 に答える
1

私はvb.netの専門家ではありませんが、null参照例外はIOExceptionではないため、例外は失敗し、より高いレベルでキャッチしてはなりません。IOExceptionを例外としてキャッチした場合、ベストプラクティスではありませんが、それでうまくいくはずです。

于 2010-04-23T19:50:23.077 に答える
0

発生する例外はIOExceptionではないためです。すべての例外をキャッチする必要があります。

于 2010-04-23T19:48:52.810 に答える
0

キャッチがすべての例外をキャッチしていると言うことは何もありません。これをカバーしない特定のクラスの例外に制限される場合があります。このクラスの例外をキャッチしている場合でも、再スローする可能性があります。適切に実行されると(つまり、throw;)、re-throwは、最初に例外を引き起こしたキャッチ内の行でスローされたものとして例外を表示します。

于 2010-04-23T19:48:57.723 に答える
0

CatchはIOExceptionをキャッチしています(のみ)。スローされる例外はNullReferenceExceptionです。

于 2010-04-23T19:50:44.297 に答える