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