web-dev-qa-db-ja.com

呼び出された関数から呼び出し元関数のキャッチブロックに例外をスローします

internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw ex;
    }
    catch(Exception ex)
    {
        throw ex;
    }
    finally
    {
        ...
    }
}


//Reading File Contents

public void ReadFile()
{
    try
    {
        ...
        ReadCSVFile(filePath);
        ...
    }
    catch(FileNotFoundException ex)
    {
        ...
    }
    catch(Exception ex)
    {
        ...
    }
}

上記のコードサンプルには、ReadFileとReadCSVFileの2つの関数があります。
ReadCSVFileで、タイプFileNotFoundExceptioonの例外が発生します。これは、catch(FileNotFoundException)ブロックでキャッチされます。しかし、この例外をスローしてReadFile()関数のcatch(FileNotFoundException)でキャッチすると、catch(FileNotFoundException)ではなくcatch(Exception)ブロックでキャッチされます。さらに、デバッグ中、exの値はObject NotInitializedと表示されます。内部例外を失うことなく、または少なくとも例外メッセージを表示せずに、呼び出された関数から呼び出し元関数のcatchブロックに例外をスローするにはどうすればよいですか?

11
Anubhav Ranjan

_throw;_の代わりに_throw ex;_を使用する必要があります。

_internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    catch(FileNotFoundException ex)
    {
        throw;
    }
    catch(Exception ex)
    {
        throw;
    }
    finally
    {
        ...
    }
}
_

それに加えて、キャッチブロックで何もせずに再スローする場合は、キャッチブロックはまったく必要ありません。

_internal static string ReadCSVFile(string filePath)
{
    try
    {
        ...
        ...
    }
    finally
    {
        ...
    }
}
_

Catchブロックのみを実装します。

  1. 例外を処理したいとき。
  2. キャッチされた例外を内部例外として新しい例外をスローすることにより、例外に追加情報を追加する場合:

    catch(Exception exc) { throw new MessageException("Message", exc); }

例外が発生する可能性のあるすべてのメソッドにcatchブロックを実装する必要はありません。

13
PVitt

呼び出された関数でthrowを使用するだけです。複数の例外タイプでcatchブロックをオーバーロードしないでください。発信者にそれを任せます。

2
Zenwalker

交換する必要があります

throw ex;

沿って

throw;
1
sll

あなたのコードはここでうまく機能します、ここをチェックしてください http://ideone.com/jOlYQ

0
Zenwalker

呼び出された関数では、次のようにthrowを使用します

 try
 {
   //you code
 }
 catch
 {
     throw;
}

ここで例外が発生した場合、これは呼び出し元の関数によってキャッチされます。

0
Syeda