Warum löst VB keinen Fehler aus?

03/04/2008 - 11:50 von Georg Weisse | Report spam
Hallo zusammen,

ich mache zurzeit nach langen Jahren VB-Classic meine ersten Gehversuche
mit VB 2005 professionell.
Da ich aus Beispielen immer gut lernen konnte, genauso wie durch Lesen
der einschlàgigen Newsgroups, habe ich mir die 'Visual Basic .NET Code
Samples: Master Set of 101 Samples' von Microsoft besorgt.

Link in einer Zeile:
http://www.microsoft.com/downloads/details.aspx?
FamilyId‡951CB9-5AEB-4F46-9BF0-2B3E3664BE77&displaylang=en

Mein erster Versuch das Client/Server-Beispiel 'VB.NET - Advanced .NET
Framework (Networking) - Use Sockets' nachzuvollziehen, endete zunàchst
ohne Erfolg: Es funktionierte einfach nicht :-(
Der Fehler war schnell auf das Server-Programm eingegrenzt, bei der Suche
nach der Ursache lernte ich bereits einiges :-)
Ich konnte die Ursache schliesslich lokalisieren, verstehe aber leider
nicht, warum VB keinen Fehler auslöst.

Beim Form-Load wird mit:

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
listenerThread = New Threading.Thread(AddressOf DoListen)
listenerThread.Start()
UpdateStatus("Listener started")
End Sub

Private Sub DoListen()
Try
listener = New TcpListener(System.Net.IPAddress.Any, PORT_NUM)
listener.Start()
Do
Dim client As New UserConnection(listener.AcceptTcpClient)
AddHandler client.LineReceived, AddressOf OnLineReceived
UpdateStatus("New connection found: waiting for log-in")
Loop Until False
Catch
End Try
End Sub

ein eigener Thread gestartet und der Vorgang in einer ListBox angezeigt.

Private Sub UpdateStatus(ByVal statusMessage As String)
lstStatus.Items.Add(statusMessage)
End Sub

Das funktioniert auch richtig.
Trotzdem konnte ein Client aber keine Verbindung herstellen.
Bei der Fehlersuche stellte ich fest, dass die Sub 'UpdateStatus' bei
einem Connect-Versuch aber korrekt die statusMessage '"New connection
found: waiting for log-in"' von 'DoListen' erhielt, aber kommentarlos
nicht in der ListBox anzeigte.
Das Kapseln von 'lstStatus.Items.Add(statusMessage)' in eine Try/Catch-
Anweisung brachte mir nun die Ursache an den Tag.

Private Sub UpdateStatus(ByVal statusMessage As String)
Try
lstStatus.Items.Add(statusMessage)
Catch exception As Exception
MsgBox(exception.ToString)
End Try
End Sub

Exception liefert:
System.InvalidOperationException = {"Ungültiger threadübergreifender
Vorgang: Der Zugriff auf das Steuerelement lstStatus erfolgte von einem
anderen Thread als dem Thread, für den es erstellt wurde."}

Nun entsehen daraus für mich 2 Fragen:

Warum wird kein Fehler ausgelöst, obwohl es keine Fehlerbehandlung gibt?

Die Aussage der Fehlermeldung ist ja eigentlich eindeutig, aber wirklich
verstehe ich sie (eher die Ursache) nicht...

Bestimmt habt Ihr ein paar lehrreiche Hinweise für mich, für die ich mich
jetzt schon, wie auch für das Lesen des überlagen Artikels, bedanke!

Ciao,
Georg
 

Lesen sie die antworten

#1 Thorsten Doerfler
03/04/2008 - 12:21 | Warnen spam
"Georg Weisse" schrieb:

Mein erster Versuch das Client/Server-Beispiel 'VB.NET - Advanced
.NET
Framework (Networking) - Use Sockets' nachzuvollziehen, endete
zunàchst
ohne Erfolg: Es funktionierte einfach nicht :-(
Der Fehler war schnell auf das Server-Programm eingegrenzt, bei der
Suche
nach der Ursache lernte ich bereits einiges :-)
Ich konnte die Ursache schliesslich lokalisieren, verstehe aber
leider
nicht, warum VB keinen Fehler auslöst.

Beim Form-Load wird mit:

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
listenerThread = New Threading.Thread(AddressOf DoListen)
listenerThread.Start()
UpdateStatus("Listener started")
End Sub

Private Sub DoListen()
Try


^^^ Hier ist Deine Fehlerbehandlung bzw. Dein Fehler ignorieren, ..
listener = New TcpListener(System.Net.IPAddress.Any, PORT_NUM)
listener.Start()
Do
Dim client As New UserConnection(listener.AcceptTcpClient)
AddHandler client.LineReceived, AddressOf OnLineReceived
UpdateStatus("New connection found: waiting for log-in")
Loop Until False
Catch


... da der Catch Block nicht ausgewertet wird.

End Try
End Sub

Trotzdem konnte ein Client aber keine Verbindung herstellen.
Bei der Fehlersuche stellte ich fest, dass die Sub 'UpdateStatus'
bei
einem Connect-Versuch aber korrekt die statusMessage '"New
connection
found: waiting for log-in"' von 'DoListen' erhielt, aber
kommentarlos
nicht in der ListBox anzeigte.
Das Kapseln von 'lstStatus.Items.Add(statusMessage)' in eine
Try/Catch-
Anweisung brachte mir nun die Ursache an den Tag.



Den Try-Catch Abschnitt hattest Du ja schon, nur eben nicht
ausgwertet.

Private Sub UpdateStatus(ByVal statusMessage As String)
Try
lstStatus.Items.Add(statusMessage)
Catch exception As Exception
MsgBox(exception.ToString)
End Try
End Sub

Exception liefert:
System.InvalidOperationException = {"Ungültiger threadübergreifender
Vorgang: Der Zugriff auf das Steuerelement lstStatus erfolgte von
einem
anderen Thread als dem Thread, für den es erstellt wurde."}

Nun entsehen daraus für mich 2 Fragen:

Warum wird kein Fehler ausgelöst, obwohl es keine Fehlerbehandlung
gibt?



In der aufrufenden Methode ist eine Fehlerbehandlung vorhanden. Ein
Fehler wird solange nach oben gereicht, bis er von irgendeiner
Fehlerbehandlung verarbeitet wird. Erst wenn das Ende dieser
Aufrufkette erreicht ist und sich keiner um den Fehler gekümmert hat,
kommt der Debugger mit dem Fehler auf.

Die Aussage der Fehlermeldung ist ja eigentlich eindeutig, aber
wirklich
verstehe ich sie (eher die Ursache) nicht...



Du darfst nicht aus einem Thread heraus auf Steuerelemente Deines
Formulars (anderer Thread) zugreifen. Dafür haben die Controls die
Invoke Methode.

Thorsten Dörfler

Ähnliche fragen