Autor |
Beitrag |
Talemantros
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 05.10.13 17:18
Talemantros hat folgendes geschrieben : | 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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
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; zahl1 = zahlPruefen(textBoxZahl1, textBoxZahl1.Text); zahl2 = zahlPruefen(textBoxZahl2, textBoxZahl2.Text);
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) { if (zahl2 == 0) divDurchNull = true; else ergebnis = zahl1 / zahl2; } 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 06.10.13 14:52
Zitat: | 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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:
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 { zahl1 = zahlPruefen(textBoxZahl1, textBoxZahl1.Text); zahl2 = zahlPruefen(textBoxZahl2, textBoxZahl2.Text); } catch (FormatException) { return; }
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) { if (zahl2 == 0) divDurchNull = true; else ergebnis = zahl1 / zahl2; } 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: 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?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 09.10.13 20:49
Talemantros hat folgendes geschrieben : | 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 
      
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Do 10.10.13 19:37
Hi,
Vielen Dank für die Erläuterung und eure Mühen.
Gruß
Daniel
|
|