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