Saturday, April 17, 2010

Hantera ohanterade fel i .Net och CAB.

Hittade en bra artikel om hur man ska hantera ohanterade fel:

Tanken är att man i sin egen kod bara hanterar fel som man vet ska inträffa:

Try
Throw New InvalidAttributeException("Fel på in argumentet!!!")
Catch ex As InvalidAttributeException
'Hanterar felet
End Try


Alla andra fel som man inte vet vad det är låter man propagera hela vägen upp till applikationen som hanterar dom ohanterade felen:

<STAThread()> _
Public Shared Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf AppDomainUnhandledException
AddHandler Application.ThreadException, AddressOf ThreadException
app = New Program()
app.Run()
End Sub

Private Shared Sub AppDomainUnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
HandleException(CType(e.ExceptionObject, Exception))
End Sub

Private Shared Sub ThreadException(ByVal sender As Object, ByVal ex As System.Threading.ThreadExceptionEventArgs)
HandleException(ex.Exception)
End Sub


Private Shared Sub HandleException(ByVal e As Exception)
'MessageBox.Show("Ohanterat fel har inträffat!!")
End Sub


Fördelarna som jag ser med detta är att man slipper risken att någon att fångar och sväljer fel bara för att dom inte vet vad man ska göra med felet. Samtidigt tycker jag att man alltid ska fånga alla fel som inträffar i sin kod för att kunna logga felen där dom inträffar. Detta står inte i konflikt med varandra eftersom man alltid kan kasta felet vidare efter man fångat ett exception. Dock bör man ha veta hur man gör för att behålla den fulla stacktracen när man gör det se t.ex:

No comments: