例外でフォームを閉じる前に処理をしたい


まるお  2006-07-13 23:23:54  No: 132350

いつもお世話になっています。

以下のようにして、フォームを起動しています。

Public Sub Main()
    Try
        Application.Run(New formMain)   '← ここでフォームを起動

    Catch ex As Exception
        FuncException(ex)  '★
    End Try
End Sub

例外処理が発生した場合に、上記コードの★の箇所で緊急終了処理を
実行しようとしていました。

しかし、★の箇所に来たタイミングでは、既にformMainがクローズしてしまっています。

なんとか、formMainがクローズするまえに、例外を処理したいのですが、
何かうまい方法はないでしょうか?

ちなみに、実験してみたところ、例外の場合は、以下のイベントは発生しませんでした。

・FormClosed
・FormClosing

どなたかご意見をください。


特攻隊長まるるう  2006-07-14 16:56:00  No: 132351

>ちなみに、実験してみたところ、例外の場合は、以下のイベントは発生しませんでした。
>・FormClosed
>・FormClosing
フォームは IDisposable インターフェイスを実装していますし、例外が起こった時は
Dispose されているのではないでしょうか。

[VB.NET]
Public Class Class1
    Public Shared Sub Main()
        Dim frm1 As formMain
        Try
            frm1 = New formMain '← ここでフォームを起動
            frm1.ShowDialog()

        Catch ex As Exception
            FuncException(ex)  '★
        Finally
            ' frm1 を破棄する
            If Not frm1 Is Nothing Then
                frm1.Dispose()
                frm1 = Nothing
            End If
        End Try
    End Sub

    Private Shared Sub FuncException(ByVal ex As Exception)

    End Sub
End Class


まるお  2006-07-20 00:42:30  No: 132352

返信ありがとうございます。

良くわからないのですが、以下の方法で、formMainのFinalizeが
コールされるようになりました。

この方法だと、何か問題ありますでしょうか?
考え方が違っていたら、指摘していただけると幸いです。

よろしくお願いします。

[VB.NET]
Public Class Class1
    Public Shared Sub Main()
        Dim frm1 As formMain
        Try
            frm1 = New formMain '← ここでフォームを起動
            frm1.ShowDialog()   

        Catch ex As Exception
            FuncException(ex)
        Finally
            ' frm1 を破棄する
            If Not frm1 Is Nothing Then
                ' frm1.Dispose()  ← この処理をコメントアウトしたら、
                                  '   frm1のFinalizeがコールされた。
                frm1 = Nothing
            End If
        End Try
    End Sub

    Private Shared Sub FuncException(ByVal ex As Exception)

    End Sub
End Class


けんじ  2006-07-21 12:43:11  No: 132353

>なんとか、formMainがクローズするまえに、例外を処理したいのですが、

Application.RunをTry-Catchで囲むのではなく、
Application.ThreadExceptionイベントで処理します。
http://www.atmarkit.co.jp/fdotnet/dotnettips/320appexception/appexception.html

>' frm1.Dispose()  ← この処理をコメントアウトしたら、frm1のFinalizeがコールされた。

Dispose()は内部でGC.SuppressFinalize(Me)を呼び出し、Finalizeの呼び出しを行わないようにしています。なお、Dispose()はDispose(true)を呼び出します。一方FinalizeはDispose(false)を呼び出します。
Finalizeの呼び出しで後処理を実行させるではなく、Dispose()を明示的に呼び出して後処理を行ってください。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加