C# - Try, Catch

Palladin007

assimiliert
Ich habe folgenden Code-Abschnitt:

Code:
            try
            {
                kontonr = Convert.ToInt32(Console.ReadLine().ToString());
            }
            catch
            {
                Console.Clear();
                Console.Write("Sie müssen ihre Kontonummer eingeben: ");
                throw;
            }

kontonr ist vom Typ int.


Ich möchte es so hinkriegen, dass die Ausnahme, dass der catch-Block jede Ausnahme abfängt.
So, wie ich das verstanden habe, ist der throw-Parameter dafür da, die Ausnahme erneut auszuführen.
Also, wenn er bei catch ankommt, gibt das Programm den Hinweis aus und beginnt danach wieder bei try, also wartet auf die Eingabe der Kontonummer.

Aber das funktioniert nicht.
Wenn das Programm dann bei throw angekommen ist, bleibt es stehen und zeigt mir folgende Fehlermeldung an:

Die Eingabezeichenfolge hat das falsche Format.


Was kann ich tun, um das hin zu bekommen.




Und kann mir jemand sagen, was es für Formate gibt, die ich bei catch eingeben kann?

Code:
try
{
    // Ausnahme
}
catch (... e)
{
    // Aktion
    throw (e);
}

Also was ich alles bei den drei Punkten eingeben kann.
Ich habe keine Liste gefunden.




PS: Wenn ich das ganze mit try und catch falsch verstanden habe, freue ich mich natürlich über Berichtigungen.


PS²: Das ist meine Quelle, wo ich das nachgelesen habe: try-catch (C#)



Edit:
Hab jetzt bei der Fehlermeldung gesehen, dass da ja steht, dass FormatExaption nicht behandelt wurde, also hab ich das mal als Typ eingegeben.
Sieht jetzt so aus:

Code:
            try
            {
                Console.Clear();
                Console.Write("Geben sie ihre Kontonummer ein: ");
                kontonr = Convert.ToInt32(Console.ReadLine().ToString());
            }
            catch (FormatException e)
            {
                Console.Clear();
                Console.WriteLine("Sie müssen ihre Kontonummer eingeben.");
                Console.ReadLine();
                throw (e);
            }

Allerdings funktioniert das immer noch nicht...
 
Zuletzt bearbeitet:
Console.ReadLine() ist schon vom Format STRING
Ansonsten solltest du alles zu deinen Funktionen lesen: http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx
Es könnte sich einfacher gestalten, jeden Tastendruck zu kontrollieren (Zahl/nicht Zahl) und auch damit einen Ausweg aus der Schleife abzufangen (zB ESC).

Ach ja, Büchereien haben sicherlich auch Bücher über C, kann nicht schaden, das auf Papier zu nutzen. Dürfte sicherlich effektiver sein, als sich mühsam alles aus dem Internet zusammen zupuzzeln oder sich einen Wolf zu fragen.
 
Console.ReadLine() ist schon vom Format STRING
Ansonsten solltest du alles zu deinen Funktionen lesen: Convert.ToInt32 Method (String) (System)
Es könnte sich einfacher gestalten, jeden Tastendruck zu kontrollieren (Zahl/nicht Zahl) und auch damit einen Ausweg aus der Schleife abzufangen (zB ESC).

Ach ja, Büchereien haben sicherlich auch Bücher über C, kann nicht schaden, das auf Papier zu nutzen. Dürfte sicherlich effektiver sein, als sich mühsam alles aus dem Internet zusammen zupuzzeln oder sich einen Wolf zu fragen.

Die Eingabe-Zeile hab ich nicht geschrieben, die wurde in dem Tutorial erstellt, was ich mir angeschaut habe.


Und die Zeile gibt ja auch brav int aus, wenn es möglich ist.

Aber, wenn es nicht möglich ist, wie wenn z.B. ein Zeichen eingegeben wird, oder nix, dann sollte es das abfangen können.
Deswegen soll das jeden Fehler abfangen.


Denn wenn ich das mit if versuche, einzubauen, dann müsste ich nach meinem derzeitigen Wissensstand jedes Zeichen, was nicht int ist, in ein array einbauen und dann mit if prüfen lassen, ab in der eingegebenen string-Variable eines von den gespeicherten Zeichen ist.

Oder kennst du eine Methode, wie ich direkt ohne Methode, etc. prüfen kann, ob man ein string in int konvertieren kann?
Dann könnte ich das bei if einbauen, danach dann in int konvertieren und so Ausnahmen abfangen.

Und für ein Buch habe ich nicht das Geld.
Ich muss mich auf das Internet beschränken, aber das stört mich auch nicht, da man ja das meiste online finden kann.



PS: Du hast ESC erwähnt.
Daran hab ich gar nicht gedacht. Kannst du mir kurz sagen, was passiert, wenn der Nutzer bei der Eingabe ESC drückt?
Wird die Variable dann einfach auf null gesetzt?

Denn wenn die Variable null ist, kann man es ja auch ganz einfach mit if abfangen.
 
Ist das zum Ausprobieren oder für ein echtes Programm?

In der praxis ist das unschön. Du fängst im catch-Block jede Exception ab. try-catch-Blöcke sind oftmals nur quick&dirty-Lösungen, daher sollte man sie nur wenn nicht anders möglich und sehr gezielt einsetzten.
Schöner ist es den eingelesenen String mit einer RegEx abzugleichen und wenn es keine Zahl ist entsprechend zu reagieren.
 
Falls die Frage noch aktuell ist

>>Also, wenn er bei catch ankommt, gibt das Programm den Hinweis aus und beginnt
>>danach wieder bei try, also wartet auf die Eingabe der Kontonummer.

>>Aber das funktioniert nicht.
>>Wenn das Programm dann bei throw angekommen ist, bleibt es stehen und zeigt mir
>>folgende Fehlermeldung an:

try..catch ist keine Schleife, setze eine Continuebedingung im catch-Zweig

do
{
try
{
[...]
fContinue = false;
}
catch
{
[...]
fContinue = true;
}
}while(fContinue);

Ansonsten schließe ich mich bei der Frage der gültigen Eingabe meinen Vorrrdnern an.

>>Und kann mir jemand sagen, was es für Formate gibt, die ich bei catch eingeben kann?

Meinst Du, welche Exceptions es gibt? Diese Angabe findest Du bei jeder .net Funktion in der Hilfestellung mit angegeben, weche exceptions geworfen werden.
 
In der praxis ist das unschön. Du fängst im catch-Block jede Exception ab. try-catch-Blöcke sind oftmals nur quick&dirty-Lösungen, daher sollte man sie nur wenn nicht anders möglich und sehr gezielt einsetzten.
Schöner ist es den eingelesenen String mit einer RegEx abzugleichen und wenn es keine Zahl ist entsprechend zu reagieren.

Das haben mir Creamy und sein Kumpel auch vorgebetet^^
Hab mich jetzt breit schlagen lassen und hab eine extra Methode gebastelt, die das so macht, wie ich es brauche.
Hab die so gebaut, dass zwei strings übergeben werden^^
Die erste Variable enthält die Eingabe-Aufforderung und die zweite Variable den Text, der bei einer Falsch-Eingabe ausgegeben wird.

So kann ich die Methode immer nutzen, egal für was.


Und RegEx hab ich noch nie gehört^^ Vielleicht lässt sich meine Version damit etwas kleiner oder einfacher machen.


@ElSer:

Danke für den Code^^
Aber im Moment hab ich es mit if und else in einer while-Endlos-Schleife gelöst, die dann bei der richtigen Eingabe halt einfach abgebrochen wird.
 
Und RegEx hab ich noch nie gehört^^

Wikipedia - Regulärer Ausdruck

Es gibt verschiedene Notationen für Reguläre Ausdrücke, da müsstest du dich für C# schlau machen, hier aber mal ein Beispiel:

Du möchtest, dass eine Zeichenkette nur Ziffern enthält. Dann stellst du dir einen Regulären Ausdruck wie folgt zusammen, und gleichst deinen String damit ab:
[0-9]*

* = Das vorangehende darf 0 bis unendlich mal wiederholt werden.
[ ] = Was in der Klammer steht, wird als eine Einheit betrachtet.
0-9 = Eine Ziffer zwischen 0 und 9 (inklusive 0 und 9)
also ist
[0-9]* = Eine Zeichenkette, die aus beliebig vielen Ziffern besteht.

Reguläre Ausdrücke werden in der Informatik häufig verwendet. Mehr dazu im verlinkten Wikipedia Artikel.
 
Achso, ja bei C# heißt das Array.


Ich habe das in meiner Methode jetzt so gemacht:

Code:
bool result = Int32.TryParse(Eingabe, out NR);

Eingabe ist vom Typ string
NR ist vom Typ int
result ist vom Typ boolean

Das testet, ob eine String sich in int umwandeln lässt^^

Das Ergebnis wird dann in result gespeichert. true, wenn es geht und false, wenn nicht.


Vielleicht kannst du das ja irgendwie auch bei Java umbauen.
 
Nur weil ich dort eckige Klammern benutzt habe, ist das noch lange KEIN Array. Ein Array ist eine Datenstruktur, um Elemente in einer Liste zu speichern und Indizierten Zugriff zu ermöglichen. Mit Regulären Ausdrücken hat das NICHTS zu tun.
 
Und für ein Buch habe ich nicht das Geld.
Deswegen "Bücherei", wo du gegen einen geringen jährlichen Obolus - sprich: Büchereiausweis - diverse gedruckte Exemplare für einen begrenzten Zeitraum mit nach Hause nehmen könntest. Wahlweise würde auch ein Büchereibus aushelfen, wo ersteres nicht vorhanden ist. Denkbar wäre auch, einen Informatiklehrer anzusprechen, ob gewünschte Literatur dort entleihbar wäre.
 
Oben