Hallo allerseits, ich möchte mit einem VB.2008 fünf Mal in der Sekunde Zeichen von der seriellen Schnittstelle holen. Auf diese Art sollen Messwerte von einem ATMega16 dargestellt werden. Ich komme aber mit der Fehlerbehandlung nicht klar. Hier mal ein Codeschnipsel: '********+*********+*********+*********+*********+*********+ ' holt alle 200msec Zeichen von der seriellen Schnittstelle ' und zeigt diese in einem Fenster an '********+*********+*********+*********+*********+*********+ Private Sub tmrComPortEmpfang_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrComPortEmpfang.Tick ' für die Dauer der Ausgabe den Timer stoppen tmrComPortEmpfang.Stop() Try ' dann den Inhalt Zeichen für Zeichen vom Port holen While (CommPort.Read(1) <> -1) ' und im Fenster ausgeben SchreibetxtEmpfang(Chr(CommPort.InputStream(0))) End While ' wenn kein Zeichen vorhanden ist, erscheint die ' Fehlermeldung 'Read Error: Timeout error ' bei diesem Fehler nichts tun Catch Fehler As TimeoutException Exit Try Catch Fehler As Exception ' bei allen anderen Fehlern die Fehlermeldung ausgeben SchreibetxtDebug1(Fehler.Message, True) End Try ' und dann den Timer wieder starten tmrComPortEmpfang.Start() End Sub Wenn als Fehler auftritt, dass keine Zeichen vorhanden sind, muss nichts weiter passieren. Diesen Fall wollte ich mit Catch Fehler as TimeourException abfangen. Sollten aber andere Fehler auftreten, wollte ich eine Meldung ausgeben. Nur das Abfangen des Fehler funktioniert nicht! Ich erhalte bei jedem Aufruf die Meldung 'Read Error: Timeout error'. Oder ist das gar keine TimeoutException? Aber wie kann ich dann den Fall das kein Zeichen vorhanden ist weiterlaufen lassen, in allen anderen Fällen aber eine Meldung ausgeben? Hätte jemand einen Tipp für mich? Vielen Dank Bot-Builder
Bot-Builder schrieb: > Catch Fehler As Exception > ' bei allen anderen Fehlern die Fehlermeldung ausgeben > SchreibetxtDebug1(Fehler.Message, True) Wenn du auf "schreibetxtDebug1" einen Breakpoint setzt, dann lass dir mal den Typ von "Fehler" bei einem Timeout anzeigen. Wenn er nicht "Exception" ist, nimm diesen Typ und spendiere ihm einen catch-Block über dem hier zitierten. Wenn er auch "Exception" ist, musst du eben "Fehler.Message" auf die von dir angegebene Meldung vergleichen. Nicht schön, aber wenn das Programm nur für dich ist kann man das wohl noch vertreten. Wenn der Typ doch "TimeoutException" ist, dann muss wohl irgendwas anderes nicht stimmen... MfG Stefan
Zumindest bei Borland fängt die Laufzeitumgebung beim Debug-Build Fehler immer noch ab. In der Fehlermeldung kann man dann den Programmfluss fortsetzen, woraufhin dann die Fehlerbehandlung in deinem Programm zum Zug kommt. Ist das bei VB vielleicht genauso?
Hallo Stefan, Stefan B. schrieb: > Wenn er nicht "Exception" ist, nimm diesen Typ und spendiere ihm einen > > catch-Block über dem hier zitierten. Ist kein "Exception", sondern ein "ApplicationException". Der Tipp mit dem Breakpoint hat es gezeigt. Wie Du geraten hast, habe ich dem einen catch-Block spendiert und nun scheint es zu funktionieren. Obwohl ich dabei dann mit den Begrifflichkeiten meine Schwierigkeiten habe. Wie unterscheiden sich die Begriffe "Exception" und "ApplicationException"? Ich habe immer gedacht, alle auftretenden Fehler sind "Exception"? Und Dinge wie "ApplikationException" oder "TimeoutException" sind schon konkrete Fehlerarten. Aber offensichtlich falsch gedacht. Leider habe ich aber keine genauere Beschreibung im Netz gefunden. Hätte jemande einen Tipp für mich, wo man Genaueres nachlesen kann. Oder vielleicht ein paar erklärende Worte. Vielen Dank. mfg Bot-Builder
Nein. Bot-Builder schrieb: > Ich habe immer gedacht, alle auftretenden Fehler > sind "Exception"? Und Dinge wie "ApplikationException" oder > "TimeoutException" sind schon konkrete Fehlerarten. Vollkommen richtig gedacht. Alle Ausnahmen werden von Exception abgeleitet. Du kannst also mit
1 | catch (Exception ex) |
alle Ausnahmen abfangen. Wenn du für jede Art der Ausnahme eine andere Fehlerbehandlung möchtest, musst du eben den genauen Typ der Ausnahme auffangen. Welcher Typ Ausnahme (in deinem Fall eben die ApplicationException) verwendet wird hängt schlussendlich von dem Menschen ab, der die Funktion programmiert hat, die die Ausnahme auslöst. Wenn das IntelliSense aufploppt wenn du den Funktionsnahmen schreibst, werden dir die Ausnahmen angezeigt, die die Funktion generieren kann ;-) Prinzipiell solle wohl gelten: Wenn möglich nutze vorhandene Ausnahmen, ansonsten erstelle deine eigenen.
Nachtrag: Die serielle Schnittstelle kann auch ein Event auslösen, wenn neue Daten empfangen wurden.
Hallo Sven, danke für die Erläuterungen. Ich sehe schon, mit dem Thema muss ich mich noch einmal intensiver auseinandersetzen. Sven schrieb: > Die serielle Schnittstelle kann auch ein Event auslösen, wenn neue Daten > empfangen wurden. > > > Einen Even zu verwenden ist ein sehr gute Idee. Da kann ich mir den Timer sparen. Wird gleich bei nächster Gelgenheit ausprobiert. Wenn ich nicht mehr weiter komme, melde ich mich einfach noch einmal (-:. mfg Bot-Builder
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.