Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 05.10.13 01:00 
Hallo zusammen,
ich habe mal eine Frage bezüglich eines Try/Catch Blocks.

Ich möchte im Try Block das Konvertieren 2er Textfelder übernehmen und mit FormatException im CatchBlock abfangen.
Kann man irgendwie auswerten welches der Textfelder den Fehler verursacht hat, oder muss ich 2 TryBlöcke schreiben.

Ich würde das Steuerelement gern wissen um später den Fokus wieder auf das Feld zu setzen, damit der Benutzer seine Eingabe korrigiert.

Danke schon mal

Grüße
und schönes Wochenende
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 05.10.13 08:43 
Benutze besser TryParse, eine Exception zu erzeugen und dann abzufangen ist kein guter Programmierstil und macht eine Auswertung wie du sie gern hättest unmöglich. (Außer indem du viele kleine Blöcke nimmst, aber das wäre auch nicht gerade schnell und ist vom Stil noch schlimmer...)

Hier steht mehr zu TryParse:
msdn.microsoft.com/D....int32.tryparse.aspx
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 05.10.13 16:33 
Hi,
danke erstmal für deine Antwort.
Leider habe ich strickte Vorgaben wie ich das zu lösen habe und die fallen mir gerade schwer umzusetzen.

Gruß
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 05.10.13 17:18 
user profile iconTalemantros hat folgendes geschrieben Zum zitierten Posting springen:
Leider habe ich strickte Vorgaben wie ich das zu lösen habe und die fallen mir gerade schwer umzusetzen.
Dann wäre es sinnvoll diese mit dazuzuschreiben. ;-) Sonst kann dazu auch niemand konkret etwas sagen.

Wenn das nur eine Übungsaufgabe ist und du try..catch nehmen sollst, kannst du ja wie gesagt um jede einzelne Umwandlung einen solchen Block setzen und dort den Fokus setzen.

In Produktivcode wäre das aber Schwachsinn.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Sa 05.10.13 19:37 
Es geht auch mit einem Block, wenn du einen Merker verwendest. Vor jeder Umwandlung gibtst du diesem Merker einen anderen Wert. Dann weißt du im Catch, wie weit du gekommen bist.

Grundsätzlich gebe ich aber Jaenicke recht. Try ist kein guter Stil. Aber es gibt durchaus Fälle, wo auch ich sowas einsetze, weil die Überprüfung aller möglichen Fehlerfälle einfach zu aufwändig ist oder Ereignisse eintreten können, die man innerhalb des Programms nicht beeinflussen kann.

Also wie üblich bei solchen Dingen: So wenig wie möglich und nur so viel, wie nötig.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 06.10.13 13:43 
Hallo und vielen Dank schon mal für eure Antworten.
Ich bekomme es einfach nicht so wie die Aufgabenstellung ist hin.
Vielleicht ist mein Problem auch, dass ich es zu genau nehme mit der Aufgabenstellung
Mein Problem ist natürlich, dass ich es in der Lernphase nach den Vorgaben lösen muss/will und später darauf aufbauend natürlich mich weiter entwicklen möchte

Diese Aufgabenstellung beinhaltet:
Eine Ausnahmebehandlung programmieren, die in einer Methode für beide Textfelder gilt und Konvertierungsfehler abfängt.
In dieser soll eine Meldung erscheinen und der Focus gesetzt werden auf das Feld, welches den Fehler verursacht hat (kein Problem)
Berücksichtigen, dass bei einer Ausnahme der Taschenrechner nicht mehr rechnet am Besten durch eine eigene Ausnahmelösung, die in der eigenen Methode eine Ausnahme auslöst und in der Berechnen Methode verarbeitet.

Mein Problem ist dabei die Tatsache, dass ich laut meinem Verständnis nur eine Ausnahmebehandlung nutzen darf (oder ich das nur falsch verstehe)
Meine Ansätze drehen sich immer ein wenig um ähnlichen Code

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
        private float zahlPruefen(TextBox steuerEle, string eingabe)
        {
            float auslager = 0;

            try
            {
                auslager = Convert.ToSingle(eingabe);

            }
            catch (FormatException fehler)
            {
                steuerEle.Select();
                throw new FormatException("TEST");
                MessageBox.Show(fehler.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            return auslager;
        }

        private void buttonBerechnen_Click(object sender, EventArgs e)
        {
            float zahl1 = 0, zahl2 = 0, ergebnis = 0;
            bool divDurchNull = false;
            
            //die beiden Zahlen einlesen und konvertieren
            zahl1 = zahlPruefen(textBoxZahl1, textBoxZahl1.Text);
            zahl2 = zahlPruefen(textBoxZahl2, textBoxZahl2.Text);

            //die Rechenoperation ermitteln und ausführen
            if (radioButtonAddition.Checked == true)
                ergebnis = zahl1 + zahl2;
            if (radioButtonSubtraktion.Checked == true)
                ergebnis = zahl1 - zahl2;
            if (radioButtonMultiplikation.Checked == true)
                ergebnis = zahl1 * zahl2;
            if (radioButtonDivision.Checked == true)
            {
                //wird eine Division durch Null versucht?
                if (zahl2 == 0)
                    divDurchNull = true;
                else
                    ergebnis = zahl1 / zahl2;
            }
            //wurde durch Null dividiert?
            if (divDurchNull == true)
                labelAnzeige.Text = "Nicht definiert!";
            else
                labelAnzeige.Text = Convert.ToString(ergebnis);
        }


Ich brauch auch nicht unbedingt eine fertige Lösung. Mir geht es auch im das selber erarbeiten und eventuellen Denkansätzen wo der Knoten ist.

Vielen Dank und schönen Sonntag


Viele Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 06.10.13 14:52 
Zitat:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            catch (FormatException fehler)
            {
                steuerEle.Select();
                throw new FormatException("TEST");
                MessageBox.Show(fehler.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }


Der MessageBox.Show wird nie erreicht. Das sollte dir der Compiler auch melden das das nicht erreichbarer Code ist. Wenn du da was ausgeben möchtest mach das vor dem throw.
Und wirf keine neue Exception sondern die die auch im catch Block ankommt. Heißt schreib einfach throw ohne was dahinter dann wird die gefangene Exception weitergeworfen und deren Information bleibt erhalten. Wenn du einen neue Exception werfen mußt/willst dann benutzt zumindest die gefangene Exception als Inner Exception der neuen. Dafür hat jede Exception einen Constructor der man eine Exception übergeben kann.
Wenn ihr neben try..catch auch try..finally behandelt habt wäre das hier eventuell der bessere Ansatz.

Zitat:
Mein Problem ist dabei die Tatsache, dass ich laut meinem Verständnis nur eine Ausnahmebehandlung nutzen darf (oder ich das nur falsch verstehe)


So verklausuliert die Aufgabenstellung auch ist das steht da nicht. In buttonBerechnen_Click kannst du eine weitere try ...catch um deine beiden zahlPruefen Aufrufe packen der die weitere Berechnung abbricht.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 06.10.13 20:49 
Vielen Dank.
Ich versuche dann noch mal mein Glück.

Ich lasse, wenn die Mods kein Problem damit haben, die Frage noch offen bis ich das gelöst habe.
Ansonsten schreibe ich dann noch mal hier

Schönen Abend noch

Viele Grüße
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Di 08.10.13 21:06 
Hey zusammen,
nachdem ich nun noch mal Zeit hatte mich damit zu beschäftigen stellt sich mir doch noch eine Frage :-(
Ich habe mal wieder das Gefühl, dass es leichter ist wie ich es mache

Ich habe nun folgenden Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
        private float zahlPruefen(TextBox steuerEle, string eingabe)
        {
            float auslager = 0;

            try
            {
                auslager = Convert.ToSingle(eingabe);

            }
            catch (FormatException)
            {
                steuerEle.Select();
                MessageBox.Show("Die Eingabe von Ihnen war fehlerhaft!" + Environment.NewLine + "Fehlerhafter Wert: " + eingabe, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Information);
                throw;
            }

            return auslager;
        }

        private void buttonBerechnen_Click(object sender, EventArgs e)
        {
            float zahl1 = 0, zahl2 = 0, ergebnis = 0;
            bool divDurchNull = false;

            try
            {
                //die beiden Zahlen einlesen und konvertieren
                zahl1 = zahlPruefen(textBoxZahl1, textBoxZahl1.Text);
                zahl2 = zahlPruefen(textBoxZahl2, textBoxZahl2.Text);
            }
            catch (FormatException)
            {
                return;
            }

            //die Rechenoperation ermitteln und ausführen
            if (radioButtonAddition.Checked == true)
                ergebnis = zahl1 + zahl2;
            if (radioButtonSubtraktion.Checked == true)
                ergebnis = zahl1 - zahl2;
            if (radioButtonMultiplikation.Checked == true)
                ergebnis = zahl1 * zahl2;
            if (radioButtonDivision.Checked == true)
            {
                //wird eine Division durch Null versucht?
                if (zahl2 == 0)
                    divDurchNull = true;
                else
                    ergebnis = zahl1 / zahl2;
            }
            //wurde durch Null dividiert?
            if (divDurchNull == true)
                labelAnzeige.Text = "Nicht definiert!";
            else
                labelAnzeige.Text = Convert.ToString(ergebnis);
        }


Ich hoffe, dass dieser soweit ok ist.
Nun steht hier:
Berücksichtigen Sie bitte bei der Lösung bitte auch, dass der Taschenrechner keine Berechnung durchführen darf, wenn eine Ausnahme aufgetreten ist. Dazu können Sie zum Beispiel in der Methode für die Überprüfung eine eigene Ausnahme auslösen, die dann ind er Methode mit den Berechnungen auswerten.

Also, der jetzige Code bricht ab bei einer Ausnahme und ich weiß nicht genau was ich mit der Aufgabenstellung anfangen soll?!
Weiterhin steht in einem vorherigen Post, dass ich besser finally nutzen sollte!

Finally ist nach meinem Verständnis ein Teil des Try Catch, der immer ausgeführt wird auch bei einer Ausnahme und mir ist es jetzt nicht ganz klar, was ich in dem Finally abarbeiten sollte?!

Vielen Dank für die Mühe, sich diese Newbie Fragen zu stellen..

Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 09.10.13 09:57 
Das mit dem finally war nicht meine beste Idee vergiss das am besten einfach. Für mich entspricht das was du hast der Aufgabenstellung und ich würde das als gelöst ansehen.

Vielleicht solltest du noch irgendwas in labelAnzeige reinschreiben wenn die Berechnung abgebrochen wird. Sieht für mich gerade so als als würde da weiterhin ein altes Ergebnis drin stehen das man so für das Ergebnis der aktuellen Berechnung halten könnte.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mi 09.10.13 19:37 
Hi,
Vielen Dank.
Das mit der labelanzeige hatte ich nach meinem Post auch schon gemacht.
"Berechnung nicht möglich"lasse ich vor dem Return im berechnungsbutton anzeigen.

Jetzt mal eine Frage außerhalb der Fragestellung: Würde man dies normal auch so lösen oder wäre ein anderer Weg ein besserer Programmierstil?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hier steht mehr zu TryParse:
msdn.microsoft.com/D....int32.tryparse.aspx
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.10.13 20:49 
user profile iconTalemantros hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt mal eine Frage außerhalb der Fragestellung: Würde man dies normal auch so lösen oder wäre ein anderer Weg ein besserer Programmierstil?

Wenn man das Try..Catch mal in Delphi-Syntax btrachtet, wird die Antwort einfacher. Dort heißt es Try..Except (Frei übersetzt Versuch .. Ausnahme). Es geht also um eine Ausnahme-Situation, die man programmatisch nicht oder nur schwierig in den Griff bekommt.

In deinem kleinen Programm würde man von vornherein dafür sorgen, dass nur zulässige Werte eingegeben werden können, so dass es theoretisch zu keiner Ausnahme kommen kann. Selbst die Division durch Null kann man vorher prüfen. Eine Ausnahme-Behandlung macht man in den Bereichen, die man als Programmierer nicht beeinflussen kann. Ein kleines Beispiel: Der Anwender will eine Datei öffnen, auf die aber durch Fremdeinwirkung (weiterer Netzwerkzugriff, andere Programme, Berechtigungen, ...) zwischen Auswahl und Öffnen nicht mehr zugegriffen werden kann. Das ist vom Programm oft nicht beeinfluss- oder prüfbar. Dort macht dann ein Try..Catch durchaus Sinn.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 10.10.13 19:37 
Hi,
Vielen Dank für die Erläuterung und eure Mühen.

Gruß
Daniel