Danke Dir. Das hat sich echt gelohnt :-) Gru�, Matthias >-----Original Message----- >From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] >Behalf Of Joachim van de Bruck >Sent: Friday, October 10, 2003 3:24 PM >To: [EMAIL PROTECTED] >Subject: AW: [Asp.net] Exception > > >Hallo! > >> >Den "Finally"-Part >> >muss man nat�rlich zus�tzlich definieren ("Sender.Close", ...). >> >> Kannst Du das bitte etwas ausf�hrlicher beschreiben? > >Wenn ich �BERALL Try-Catch-Finally-Bl�cke habe, sehe ich die Besonderheiten >einzelner nicht mehr. Also mache ich zun�chst einmal ein zentrales >Try-Catch-Finally in der Global.asax oder in der Sub Main bei >Windows-Forms-Applikationen. Wenn ich dann mal im Code Try-Catch-Finally >verwende, dann f�llt das als Besonderheit direkt auf. > >Finally-Bl�cke werden aber immer ausgef�hrt und sind deshalb pr�destiniert >f�r Aufr�umarbeiten, also z. B. das Schlie�en von Deteien oder das Freigeben >von nicht mehr ben�tigten Ressourcen. Deshalb findet man das auch so in >vielen Beispielen. Aber die sind auch tr�gerisch: Eine Database-Connection, >die im Finally-Block geschlossen wird, erzeugt wiederum eine Exception, wenn >das Objekt noch gar nicht geladen wurde (NullReference), die erste Exception >also vor dem Laden auftrat. Also braucht man daf�r wieder eine If-Abfrage. > >Mein Code: > >Dim dbc As New Data.SqlClient.SqlConnection(...) >Dim cmd As New Data.SqlClient.SqlCommand("...", dbc) >Cmd.Execute >Cmd.Dispose : dbc.Close : dbc.Dispose > >Mit Try-Catch-Finally: > >Dim dbc As Data.SqlClient.SqlConnection >Dim cmd as Data.SqlClient.SqlCommand >Try > dbc = new Data.SqlClient.SqlConnection(...) > cmd = new Data.SqlClient.SqlCommand("...", dbc) > Cmd.Execute >Catch ex As Exception > ... >Finally > If Not cmd Is Nothing Then cmd.Dispose > If Not dbc Is Nothing Then dbc.Close : dbc.Dispose >End Try > >Aus 4 Zeilen werden also 12 Zeilen, blo� weil die Objekte au�erhalb von >Try-Catch-Finally deklariert werden m�ssen, damit sie im Finally-verwendet >werden k�nnen. Das wird dann auf die Dauer ziemlich un�bersichtlich. ;-) > >Meine 4 Zeilen sind da �berschaubarer. Aber in der Global.asax oder in der >Sub Main mache daf�r eine globale Fehlerbehandlung. Ich unterscheide dabei >zwischen Produktions- und Entwicklungssystem und wohin der User dann >umgeleitet wird. Meistens erfordert eine Exception doch irgendeinen Abbruch, >oder? In der globalen Routine kann man dann die Objekte auch freigeben, >entweder durch "sp�tes binden" (separate Assembly mit "Option Strict >Off")oder abh�ngig vom Typ oder mit Trial-And-Error, also z. B. > >Try > Sender.Close >Catch : End Try >Try > Sender.Dispose >Catch : End Try > >Oder > >Try > CType (Sender, Data.SqlClient, SqlConnection).Close >Catch : End Try >Try > CType (Sender, Data.SqlClient, SqlConnection).Dispose >End Try > >Oder > >If Sender.GetType().ToString = GetType(Data.SqlClient.SqlConnection) Then > CType (Sender, Data.SqlClient, SqlConnection).Close > CType (Sender, Data.SqlClient, SqlConnection).Dispose >ElseIf ... >... >End If > >Zum Aufr�umen reicht es aber auch aus, nacheinander die Methoden "Close", >"Dispose" und "Finalize" zu probieren. Was damit nicht klappt, wird von der >Garbage-Collection erledigt, oder? > >Freundliche Gr��e >Joachim van de Bruck > > >_______________________________________________ >Asp.net mailing list >[EMAIL PROTECTED] >http://www.glengamoi.com/mailman/listinfo/asp.net > >
_______________________________________________ Asp.net mailing list [EMAIL PROTECTED] http://www.glengamoi.com/mailman/listinfo/asp.net
