2016-04-16 8 views
0

私はちょうどこのネストされたtry-catchブロックのロジックを確認したいと思います:入れ子になってみキャッチロジック

Try 
     Using dbConn As New SqlConnection With {.ConnectionString = strConnStr} 
      dbConn.Open() 
      'Prepare transaction 

      Try 
       ' Execute transaction 
      Catch ex As Exception 
       Try 
        ' Transaction rollback 
       Catch ex2 As SqlException 
        ' ... 
       End Try 
      Finally 
       dbConn.Dispose() 
      End Try 
     End Using 
    Catch ex As Exception 
     ' ... 
    End Try 
  1. トランザクションが(第二try-catchブロックが実行される前に、データベース接続が失敗した場合)、例外は最初のキャッチブロックでキャッチされ、今後はさらに処理が進まなくなります。

  2. ネストされたTry-Catchブロックのケースでは、例外は独自のtry-catchブロック内に含まれていますか?つまり、トランザクションの実行が失敗した場合、ロールバックを開始する2番目のcatchブロックが呼び出されますが、最初のcatchブロックは呼び出されません。同様に、トランザクションのロールバックが発生すると、最初の2つではなく、対応するcatchブロックが呼び出されます。

+0

例外は、キャッチラインで定義された例外タイプと一致する限り、バブルアップしません。 catchブロック内からエラーを取り消して、バブル処理することができます。意図的に接続文字列を誤ってしまうと、何が起こるのかが明らかになります(ブレークポイントとともに)。 – MrGadget

答えて

0

例外がスローされると、最も近いキャッチブロックに渡されます。それを処理するtryブロックに対応します。例外を処理するcatchブロックがない場合、または対応するcatchブロックが例外をスローした場合は、try/catchブロックが存在する場合はそれが出力され、親catchブロックに例外が渡されます。

関連する問題