« 2011年2月 | トップページ | 2011年5月 »

2011年4月 3日 (日)

例外が発生してもデバッグで停止しない現象

今まで気が付きませんでしたが、例外が発生してもデバッガが停止してくれないというバグがVisual Studioにはあったのです。

64ビット版のWindowsで開発していると、FormのLoadイベント実行中に例外が発生しても実行が停止せず、フォームが表示されます。

たとえば次のコードで再現できます。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim i As Integer = CInt("ASDF")
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer = CInt("ASDF")
    End Sub
End Class

このコード、どうみてもFormのLoadイベントで型変換エラー(InvalidCastException)が発生するはずなのですが、見事にスルーされ、普通にフォームが表示されます。Button1をクリックした場合は期待通り例外が発生し、デバッガにより処理が中断されます。

実はどちらの場合も例外自体は発生しているようなのですが、その行で黄色く表示されて処理を停止するという部分がうまく動かないようです。

なお、Loadイベントで例外発生行より下にコードがある場合、それらのコードは実行されません。

ためにしVisual Studio 2010 SP1を入れてみたんですが、この現象は直っていませんでした…。こまりますねぇ。

■対象1:Shownイベント

お手軽に対処するにはLoadイベントではなくShownイベントを使うという手があります。Shownイベントではこの現象は発生しません。ただ、LoadとShownは発生するタイミングが違うので代替できない場合もあります。

■対処法2:Stop

他には、Stopを使った停止は可能なので、このようなプログラムを書くことでかわせる場合もあるでしょう。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error Resume Next

        Dim i As Integer = CInt("ASDF")

        If Err.Number <> 0 Then
            Stop
        End If
    End Sub

■対処法3:例外発生時に停止

あと、Expressでは使えない手ですが、[デバッグ] メニュー- [例外]の設定で、Common Language Runtime Exceptions の「スローされるとき」にチェックをするという方法もあります。こうするとLoadイベント実行中の例外でも停止してくれるようになりますが、他のTryとかOn Errorとかやっているところでも例外発生時にいちいち停止するようになってしまうので、万能ではありません。

Loadeventbug

参考

http://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows-form-or-wpf-application.aspx

| | コメント (0) | トラックバック (0)

« 2011年2月 | トップページ | 2011年5月 »