

少し構造が分かりにくいかもしれませんが、現状をお伝えします。

STEP1：Class1 より Form1を呼び出し（Form1の引数はインターフェイスで定義してありclass1のインスタンスを渡します）

STEP2: Form1のShownイベントより、引数で受け取ったインターフェイスのメソッドを新しいスレッドを作成し、スタートさせます。

STEP3:
スタートさせたスレッドのエラーを拾いたいのですが、実行したメソッドの内部ではキャッチされるのですが、上位でトライを書いてみてもキャッチすることができません。

**Class1**

[code]

    dim f1 as new form1(me)
    f1.showdialog()
    
[/code]

**Form1**

[code]

    dim IF as InterFace
    sub new (byval IF as InterFace)
       me.InterFace = IF
    end sub
    
    ' FormShownイベント
    Dim Thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf threadA))
    tread1.isBackGround = true
    tread1.start()
    
    private sub threadA
       me.IF.method
    end sub
    
[/code]

エラーをキャッチするタイミングとしては、Form1を呼び出すclass1がベストなのですが、そもそもエラーをキャッチすることができません。  
どなたかお分かりになる方はいらっしゃいませんでしょうか。


CC BY-SA 3.0
2015-09-18T07:41:40.550
16742
2015-09-18T11:14:27.873
2015-09-18T08:28:57.907
4236
12258
question
.net visual-studio vb.net
別フォームでのエラーをキャッチしたい。


> エラーをキャッチするタイミングとしては、Form1を呼び出すclass1がベストなのですが、そもそもエラーをキャッチすることができません。

「エラーをキャッチ」と書かれていますが、キャッチという表現をされている以上、例外のキャッチを意図しているものと受け取ります。  
例外は呼び出し元に向けて投げられます。しかしスレッドは呼び出し関係にありません。事実、`tread1.start()`を実行すると呼び出し元としては次の行に進みます。ですので別スレッドで発生した例外をキャッチすることはできません。

ただし、Visual Studio 2012から導入された[Async](https://msdn.microsoft.com/ja-
jp/library/hh191564\(v=vs.110\).aspx)を使用すると別スレッドで実行したにもかかわらず発生した例外は呼び出し元に転送されます。  
質問にはVisual
Studioのバージョン及び別スレッドで行いたい処理について言及されていないため、このAsync機能を利用できるかは判断できませんので紹介にとどめます。  
参考： [Async および Await を使用した非同期プログラミング](https://msdn.microsoft.com/ja-
jp/library/hh191443\(v=vs.110\).aspx)


CC BY-SA 3.0
2015-09-18T08:25:16.453
16744
2015-09-18T08:25:16.453
4236
16742
answer


sayuriさんの記述されているとおり例外がClass1でキャッチできないのは実行スレッドが異なるからです。このような場合、`Control.BeginInvoke`メソッドでUIスレッド上での処理を開始することができますので、その中で例外を再スローすれば要望の動作になるかと思います。

[code]

    Private Sub threadA()
        Try
    
            me.IF.method
    
        Catch ex As Exception ' Catchを追加
    
            ThrowException(ex)
    
        End Try
    End Sub
    
    ' UIスレッド上で例外をスローするメソッド
    Private Sub ThrowException(ex As Exception)
    
        SyncLock Me ' フラグ用のロック
    
            ' 例外発生時にすでにフォームが閉じていることも考えられるので判定する
            If _closed Then
    
                Return
    
            End If
    
            ' InvokeRequiredがTrueである場合はスレッドが異なるのでBeginInvokeを行う
            If Me.InvokeRequired Then
    
                Me.BeginInvoke(New Action(Of Exception)(AddressOf ThrowException), ex)
    
                Return
    
            End If
    
            ' メインスレッド上で例外を再スロー
            Throw New Exception("threadAで例外が発生しました", ex)
    
        End SyncLock
    
    End Sub
    
    ' フォームが閉じられているかのフラグ
    Private _closed As Boolean
    
    ' フォームが閉じられたらフラグを立てる
    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    
        SyncLock Me
    
            _closed = True
    
        End SyncLock
    
    End Sub
    
[/code]


CC BY-SA 3.0
2015-09-18T11:14:27.873
16752
2015-09-18T11:14:27.873
5750
16742
answer