インターフェース実装クラス利用時にエラーキャッチするには?

解決


高橋  2011-07-20 16:16:49  No: 102997  IP: [192.*.*.*]

VB6(SP6),WinXP

はじめまして。
下に記しましたテストコードでTestA,TestBの動きを比較したところ、
・TestAはイミディエイトウィンドウに出力
・TestBは実行時エラーメッセージボックス出現
という結果になってしまいました。


TestBのケースで、何とかフォーム側でエラーをキャッチしたいのですが、
どのようにするのかを教えていただけないでしょうか。


現状では、
Functionの戻り値でErr.Number、クラスのメンバでErr.Descriptionを渡す
といった方法くらいしか思いつきません。

ちなみに
同様のテストコードをExcel2007のVBAで試すと
どちらもイミディエイトウィンドウに出力されました。

以上、どうぞよろしくお願いします。



以下はテストコードです。
------------------------------------------------------------------
'フォーム:Form1.frm
Option Explicit

Private Sub Command1_Click()
    Dim cTestA As TestA
    Dim cTestB As ITest
    Set cTestA = New TestA
    Set cTestB = New TestB
On Error GoTo Finally
    'ここのコメントを切り替えて動きを比較
    Call cTestA.TestExecute
    'Call cTestB.TestExecute
Finally:
    Set cTestA = Nothing
    Set cTestB = Nothing
    If Not Err.Number = 0 Then
        Debug.Print Err.Number, Err.Source, Err.Description
    End If
End Sub
------------------------------------------------------------------
'標準モジュール:Common.bas
Option Explicit

Public Sub ThrowException()
    If Not Err.Number = 0 Then
        Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)
    End If
End Sub
------------------------------------------------------------------
'インターフェースクラス:ITest.cls
Option Explicit

Public Function TestExecute() As Boolean

End Function
------------------------------------------------------------------
'クラス:TestA.cls
Option Explicit

Friend Function TestExecute() As Boolean
On Error GoTo Finally
    Call Err.Raise(5000, "TestA", "TestAのエラー")
Finally:
    Call ThrowException
End Function
------------------------------------------------------------------
'クラス:TestB.cls
Option Explicit

Implements ITest

Private Function ITest_TestExecute() As Boolean
On Error GoTo Finally
    Call Err.Raise(5000, "TestB", "TestBのエラー")
Finally:
    Call ThrowException
End Function
------------------------------------------------------------------

編集 削除
魔界の仮面弁士  2011-07-20 17:14:26  No: 102998  IP: [192.*.*.*]

コードエディタを右クリックして、[設定/解除(T)]から
エラー中断モードを切り替えておきましょう。


この設定は、VB6メニューの[ツール(T)]-[オプション(O)...]から
オプションダイアログとを開き、その全般タブからも設定できます。

編集 削除
魔界の仮面弁士  2011-07-20 17:17:16  No: 102999  IP: [192.*.*.*]

> 同様のテストコードをExcel2007のVBAで試すと
> どちらもイミディエイトウィンドウに出力されました。

VBA の場合も同様に、オプションダイアログの[全般]タブで切り替えられます。
VB6 の場合と違って、コードエディタの右クリックメニューにはありませんけれどね。

編集 削除
高橋  2011-07-20 17:39:04  No: 103000  IP: [192.*.*.*]

> コードエディタを右クリックして、[設定/解除(T)]から
> エラー中断モードを切り替えておきましょう。

早速中断モードを切り替えたところ成功しました!


お忙しい中教えていただきまして、
ありがとうございました。

編集 削除
高橋  2011-08-01 13:46:07  No: 103001  IP: [192.*.*.*]

今更ですが、テストコードが動作比較する上では不適切でした。
Friend→Public

試行錯誤した名残です。申し訳ありません。

編集 削除