场景: 我有数百个应用程序实例在客户机上运行,执行某项工作。就像一个云应用程序。vb.net计时器和异常(try ... catch)和内存泄漏
目标:当他们中的任何一个出现错误时,我想将错误报告给错误日志数据库,并且默默退出应用程序以避免用户烦恼。
问题: 我已经迁移到VB.NET最近,还不知道这是最好的办法错误处理代码。这些实例正在定时器下运行一个例程。
Private Sub timerLifeSignal_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timerLifeSignal.Tick
MAINSUB()
End Sub
Friend Sub MAINSUB()
frmSAN.timerLifeSignal.Enabled = False
...
'do the job
...
frmSAN.timerLifeSignal.Enabled = True
end sub
乍一看我已经把的try/catch到每一个单一的功能但因为AFIK,创建的异常对象未正确设置它会导致内存泄漏。
那么有没有办法让try/catch在这些情况下不会发生内存泄漏?
THX,
UPDATE: 基本上我在做什么是一样的东西:
Private Sub timerLifeSignal_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timerLifeSignal.Tick
MAINSUB()
End Sub
Friend Sub MAINSUB()
Try
frmSAN.timerLifeSignal.Enabled = False
...
'do the job
...
frmSAN.timerLifeSignal.Enabled = True
Catch ex as Exception : gERRFUNC(" | MAIN | " & ex.Message) : End Try
end sub
friend sub dothejob
try
...
' really do the job
...
Catch ex as Exception : gERRFUNC(" | MAIN | " & ex.Message) : End Try
end sub
等等......最后(在这里可以是我的错),另一个try/catch嵌套到这里:
Public Sub gERRFUNC(Optional ByVal errorMSG As String = "")
Try
' log message on database
SQL = "INSERT INTO sanerrorlog VALUES (NULL, '" & currentMySQLTime() & "', '" & errorMSG & "');"
' function that open conn and execute the sql... working fine
' NOTE THAT INSIDE THE DORS FUNCTION THERE'S ALSO A TRY/CATCH USING THE SAME EX OBJECT.
DORS(SQL)
' clean up things
SQL = "DELETE FROM sannie WHERE sid=" & gMyID
DORS(SQL)
For i = 0 To UBound(gCONN)
If gCONN(i).State = ConnectionState.Open Then gCONN(i).Close()
Next
frmSAN.nfi.Visible = False
gWWB = Nothing
End
Catch E As Exception: End: End Try
End Sub
所以......如果我这样做:
Private Sub timerLifeSignal_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timerLifeSignal.Tick
Try
MAINSUB()
Catch ex as Exception : gERRFUNC(" | MAIN | " & ex.Message) : End Try
End Sub
指内mainsub所有的异常应该逮住?
'Try/catch'不是内存泄漏。显然,'做这份工作'还有其他的东西。 – GSerg
我已经检查过它。通过删除所有尝试/捕获内存泄漏停止。我读过某处(丢失链接,对不起),异常是一个对象本身,意味着它必须妥善处置。由于这些函数下降到4级,可能vb垃圾收集器不会清除这些objetcs。 –
@Paulo异常没有Dispose方法,因此不能处理。你显然看到的是还没有被垃圾回收的异常对象(但最终会)。 – GSerg