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;」とした方がよい。