いつもお世話になっています。
以下のようにして、フォームを起動しています。
Public Sub Main()
Try
Application.Run(New formMain) '← ここでフォームを起動
Catch ex As Exception
FuncException(ex) '★
End Try
End Sub
例外処理が発生した場合に、上記コードの★の箇所で緊急終了処理を
実行しようとしていました。
しかし、★の箇所に来たタイミングでは、既にformMainがクローズしてしまっています。
なんとか、formMainがクローズするまえに、例外を処理したいのですが、
何かうまい方法はないでしょうか?
ちなみに、実験してみたところ、例外の場合は、以下のイベントは発生しませんでした。
・FormClosed
・FormClosing
どなたかご意見をください。
>ちなみに、実験してみたところ、例外の場合は、以下のイベントは発生しませんでした。
>・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
返信ありがとうございます。
良くわからないのですが、以下の方法で、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
>なんとか、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()を明示的に呼び出して後処理を行ってください。
| ツイート |
|