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

Antwort per Email an