Forum: PC-Programmierung gezielte Fehlerbehandlung bei try - catch in VB.2008


von Bot-Builder (Gast)


Lesenswert?

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

von Stefan B. (Gast)


Lesenswert?

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

von C-Programmierer (Gast)


Lesenswert?

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?

von Bot-Builder (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

Nachtrag:

Die serielle Schnittstelle kann auch ein Event auslösen, wenn neue Daten 
empfangen wurden.

von Bot-Builder (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.