2014-06-13 41 views
1

我的Visual Basic 6程序(最初由其他人編寫)中發生了一個錯誤,其中(全局)標誌被設置爲應始終在例程。有時(很少,很常見)它不是。據我所知,它將始終在正常流程中重置,查看子問題。防止Visual Basic 6中的調用程序錯誤捕獲

我最好的猜測是這個標記是如何設置的,是在調用函數(可能有很多)中有錯誤處理,可能是用「Resume Next」錯誤處理錯誤。有沒有什麼辦法可以阻止我感興趣的sub從錯誤傳遞到更高級別hander,,同時還向我顯示錯誤發生的線路和原始錯誤? (很明顯,我可以將問題包裝在On error標籤中並且有一個msgbox提示符,但是這會讓我相當迷失於發生實際錯誤的位置)

+2

爲什麼不把一個監視變量打破,如果它改變,你不是在正確的狀態? –

+0

它經常變爲有用的 - 會一直打破 - 而且它的錯誤在於* not * changins。 – CMaster

+0

這是你正在談論的一個例程嗎?或者一些不同的例程,都使用相同的標誌設置/重置? –

回答

1

通過您最近的評論,您說有三個例程。由於這是不是太苛刻,我會建議使用以下模式:

Sub Routine_n() 

    On Error GoTo ErrorHandler 

    ... code ... 

    g_bGlobalFlag = False 

Exit Sub 

ErrorHandler: 
    g_bGlobalFlag = False 
    Err.Raise Err.Number, Err.Source, Err.Description 
End Sub 

有關添加代碼錯誤處理程序通常的危險是,你無意中重置Err對象。對此的響應是將Err對象的屬性保存到臨時變量,並使用這些臨時變量重新調整錯誤。但是,在這種情況下,由於設置布爾變量不會導致錯誤情況,因此在重新設置錯誤之前簡單地重置標誌是非常合理的。

+0

如果我的猜測是正確的,那麼這將是一個(哈克)解決問題的方法。然而,正如它運行的「全部休息」顯示,沒有例外,處理或其他。 相反,問題原來是一個帶有「DoEvents」的超時循環,讓另一個例程中斷而不接管。去除可詛咒的DoEvents解決了這個問題(和其他幾個問題) – CMaster

+0

唉! DoEvents是邪惡的! –