0

私はGoogleを介して助けを得ることができない例外を見つけることに問題があります。 Visual Studioは、これらのタイプを見つけることができるかどうかを判断することができないので、驚くべきことではありません。VBで例外を含む児童問題winforms - 例外タイプが見つかりませんか?

これは私が合理的な(一時的な!)トップレベルのtry-catchを追加しようとしているWinformsアプリケーションです。しかし、名前空間をインポートする必要がなく、決定的でないVSがあっても、これらの例外を除いてはコンパイルされません。最初の画像が見える場合は、存在しないと判断されます。 Now it's fine - it's lying Now it's not happy

Public Sub MainTry(action As Action) 
    Dim subname = If(NameOf(action) IsNot Nothing, NameOf(action), "anonymous") 
    Try 
     action() 
    Catch ex As Application.Current.DispatcherUnhandledException 'Also tried Catch ex As Application.ThreadException 
     ErrorHelper.Log(ex, "ThreadException", subname) 
    Catch ex As System.AppDomain.UnhandledException 
     ErrorHelper.Log(ex, "", subname) 
    Catch ex As Exception 
     ErrorHelper.Log(ex, "General Exception", subname) 
    Finally 
     If MsgBox("Do you wish to restart TMS?", MsgBoxStyle.Exclamation, app_name) = MsgBoxResult.Yes Then 
      Application.Restart() 
     Else 
      Application.Exit() 
     End If 
    End Try 

End Sub 

VS 2015は、私は感謝されると思いますこれらの例外タイプについて、このような痛みをされている理由は、誰も説明することができます。

プロジェクトでは、Office InteropとDevexpressのwinformsを使用しています。ツールチップのヘルプは、これらのライブラリの代替案をポップアップ表示しています。名前を付けて明示しようとしましたが、これは役に立ちませんでした。

+0

これらのタイプの例外に対してハンドラを作成する必要があるようです。 [this](https://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx)を見てください。 – Bugs

答えて

2

これらは例外ではありません。あなたがあなたの写真を見れば、それは言う:

イベント ThreadExceptionEventHandler

としてApplication.ThreadException

AppDomain.UnhandledExceptionApplication.ThreadExceptionは例外がTry/Catchでキャッチではないことが発生した場合提起されているeventsですステートメント(これがイベントでもあります)。

あなたがそれらを処理する場合は、フォームのLoadイベントでイベントをサブスクライブすることができます

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomain_UnhandledException 
    AddHandler Application.ThreadException, AddressOf Application_ThreadException 
End Sub 

Private Sub AppDomain_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs) 
    ErrorHelper.Log(DirectCast(e.ExceptionObject, Exception), "UnhandledException", "") 
End Sub 

Private Sub Application_ThreadException(sender As Object, e As ThreadExceptionEventArgs) 
    ErrorHelper.Log(e.Exception, "ThreadException", "") 
End Sub 

this answerによるとドキュメント二つの事象間の差は、例外があるときApplication.ThreadExceptionが発射されるということです未処理のWinFormsスレッドで処理されていない場合(無視して実行を続行するように選択できる例外)、AppDomain.UnhandledExceptionイベントは、WinForms以外のスレッドで例外が処理されなかった場合、またはThreadExceptionが無効になったときに発生します。

Application.ThreadExceptionのほかに、AppDomain.UnhandledExceptionイベントを発生させる未処理の例外が発生した場合、プログラムの実行を続行できません。

+0

こんにちはヴィンセント、ありがとう!私が他の場所で例外を見つけたとき、この違いは私には分かりませんでした。私はそれが何か基本的なものであることを知っていた。私はあなたの助けに非常に感謝します。 –

+0

@RichardGriffiths:問題ありません。実際の違いは、実際の例外はクラスであり、これらの2つは例外がスローされた_indicating_イベントです。 - IntelliSenseが示すオブジェクトの種類を確認できます。 '*** Exception'がクラスの場合、' Catch'ステートメントでそれを使うことができます。 –

関連する問題