Exception throw時のStack Trace(^o^)

例外をcatchし、それをさらに上位に伝播(throw)させる場合、throwのコーディングの仕方によって上位で取得するStack Traceの内容が異なる。

private void StackTraceDisplay()
{
    try
    {
        CatchAndThrow();
    }
    catch(Exception ex)
    {
        string stackTrack = ex.ToString(); //スタックトレースの内容
    }
}
		
private void CatchAndThrow()
{
    try
    {
        ・・・・・
        this.sqlConnection1.BeginTransaction();
        ・・・・・
    }
    catch(Exception ex)
    {
        ・・・・・
        ① throw;   //無指定
        ② throw ex; //catchしたExceptionをそのままthrow
    }
}

上記①の場合

System.InvalidOperationException: 操作が無効です。接続は閉じています。
場所 System.Data.SqlClient.SqlConnection.GetOpenConnection()
場所 System.Data.SqlClient.SqlConnection.BeginTransaction(〜省略〜)
場所 System.Data.SqlClient.SqlConnection.BeginTransaction()
場所 ExceptionTest.MainForm.CatchAndThrow()
場所 ExceptionTest.MainForm.StackTraceDisplay()

上記②の場合

System.InvalidOperationException: 操作が無効です。接続は閉じています。
場所 ExceptionTest.MainForm.CatchAndThrow()
場所 ExceptionTest.MainForm.StackTraceDisplay()

throw exとコーディングするとそのメソッドより下位以下のトレースが出力されない。
障害調査用に多くの情報がほしければ、catch&throwをする際は単に「throw;」とした方がよい。