mikrocontroller.net

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


Autor: Bot-Builder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: C-Programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bot-Builder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

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

Autor: Bot-Builder (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.