Option Explicit Dim g_ErrEmulate Const F_ErrInCaller = 1 Const F_ErrInFinish = 2 Const F_ErrInCancel = 4 Const F_ErrInRelease = 8 Const F_NotCallFinish = 16 Class ClassA Private m_bFinished Public Sub Finish() WScript.Echo "Finish(1)" If g_ErrEmulate and F_ErrInFinish Then WScript.Echo "ERROR!" : Err.Raise 1,,"in Finish" WScript.Echo "Finish(2)" m_bFinished = True End Sub Private Sub Class_Terminate() Dim en,ed : en = Err.Number : ed = Err.Description On Error Resume Next ' This clears the error If en <> 0 Then WScript.Echo "Cancel" If g_ErrEmulate and F_ErrInCancel Then WScript.Echo "ERROR!" : Err.Raise 1,,"in Cancel" End If WScript.Echo "Release" If g_ErrEmulate and F_ErrInRelease Then WScript.Echo "ERROR!" : Err.Raise 1,,"in Release" ErrorCheckInTerminate If en = 0 and not m_bFinished Then NotCallFinish On Error GoTo 0 : If en <> 0 Then Err.Raise en,,ed End Sub End Class Sub NotCallFinish() Stop : WScript.Echo "[ERROR] not call Finish" End Sub Sub ErrorCheckInTerminate() If Err.Number <> 0 Then Stop : WScript.Echo "ERROR(" & Err.Number & ") " & Err.Description & _ " in Class_Terminate" End If End Sub Sub main() Dim m : Set m = new ClassA If g_ErrEmulate and F_ErrInCaller Then WScript.Echo "ERROR!" : Err.Raise 1,,"in Caller" If ( g_ErrEmulate and F_NotCallFinish ) = 0 Then m.Finish WScript.Echo "After Finish" End Sub '//=== Test Dim en,ed, s For g_ErrEmulate = 0 To 31 s = "" If g_ErrEmulate and F_ErrInCaller Then s = s + "ErrInCaller, " If g_ErrEmulate and F_ErrInFinish Then s = s + "ErrInFinish, " If g_ErrEmulate and F_ErrInCancel Then s = s + "ErrInCancel, " If g_ErrEmulate and F_ErrInRelease Then s = s + "ErrInRelease, " If g_ErrEmulate and F_NotCallFinish Then s = s + "NotCallFinish, " WScript.Echo "-----------------" WScript.Echo s On Error Resume Next main en = Err.Number : ed = Err.Description : On Error GoTo 0 If en <> 0 Then WScript.Echo "ERROR(" & en & ") " & ed Next