Benutzer mit den meisten Antworten
Retry-Prozedur schreiben

Frage
-
Hallo Forum,
ich habe eine Methode "Kopieren", wenn der User einen Fehler bekommt (z. B. Datei nicht vorhanden) zeige ich die MessageBox mit Buttons: Cancel und Retry.
Frage: wie schreibe ich eine Retry-Prozedur die im grundegenommen nichts anderes macht, als die gleiche Methode erneut aufzurufen?
In den "alten, guten" VB-Zeiten hätte man zu "goto" gegriffen. Wie machen wir es mit C#?
Vielen Dank für Eure Hilfe
P.
Antworten
-
Hallo P.,
Du könntest z.B. als äußeres Konstrukt eine Do...While-Schleife verwenden, die einen Try-Catch-Block umschließt. Darin inkrementierst Du einen Zähler und setzt einen Fehler-Flag auf true, im While-Block überprüfst Du diese beiden Variablen und setzt die Schleife fort, bzw. unterbrichst Sie wenn der Zählerstand erreicht wurde etc.P.S. Und das Ganze könntest Du - falls Du dieses Konstrukt öfters brauchst - in eine allgemeine Methode verpacken z.B. TryPerformAction(Action, maxRepeats) oder als Erweiterungsmethode definieren.
static bool TryPerformAction(Action action, int maxRepeats) { bool isSuccess = false; int repeatCount = 0; do { try { repeatCount++; action(); isSuccess = true; } catch { isSuccess = false; // Logging etc. } } while (!isSuccess && repeatCount < maxRepeats); return isSuccess; }
Der Aufruf könne dann in etwa so aussehen:
bool result = TryPerformAction(CopyFile, 3);
Gruß
Marcel- Als Antwort vorgeschlagen Pawel Warmuth Mittwoch, 20. Juli 2011 13:06
- Als Antwort markiert Purclot Mittwoch, 20. Juli 2011 13:57
-
Hallo P.,
hier ein Beispiel:
private void Form1_Load(object sender, EventArgs e) { while (Kopieren() == DialogResult.Retry) ; } DialogResult Kopieren() { try { File.Copy("QuellDateipfad", "ZielDateipfad"); } catch (Exception exp) { return MessageBox.Show(exp.Message, "Kopier-Fehler", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); } return DialogResult.OK; }
"goto" verwendet man in C# nur in sehr wenigen Ausnahme-Situationen.
ciao Frank
- Als Antwort vorgeschlagen Pawel Warmuth Mittwoch, 20. Juli 2011 13:07
- Als Antwort markiert Purclot Mittwoch, 20. Juli 2011 13:57
Alle Antworten
-
Hallo P.,
Du könntest z.B. als äußeres Konstrukt eine Do...While-Schleife verwenden, die einen Try-Catch-Block umschließt. Darin inkrementierst Du einen Zähler und setzt einen Fehler-Flag auf true, im While-Block überprüfst Du diese beiden Variablen und setzt die Schleife fort, bzw. unterbrichst Sie wenn der Zählerstand erreicht wurde etc.P.S. Und das Ganze könntest Du - falls Du dieses Konstrukt öfters brauchst - in eine allgemeine Methode verpacken z.B. TryPerformAction(Action, maxRepeats) oder als Erweiterungsmethode definieren.
static bool TryPerformAction(Action action, int maxRepeats) { bool isSuccess = false; int repeatCount = 0; do { try { repeatCount++; action(); isSuccess = true; } catch { isSuccess = false; // Logging etc. } } while (!isSuccess && repeatCount < maxRepeats); return isSuccess; }
Der Aufruf könne dann in etwa so aussehen:
bool result = TryPerformAction(CopyFile, 3);
Gruß
Marcel- Als Antwort vorgeschlagen Pawel Warmuth Mittwoch, 20. Juli 2011 13:06
- Als Antwort markiert Purclot Mittwoch, 20. Juli 2011 13:57
-
Hallo P.,
hier ein Beispiel:
private void Form1_Load(object sender, EventArgs e) { while (Kopieren() == DialogResult.Retry) ; } DialogResult Kopieren() { try { File.Copy("QuellDateipfad", "ZielDateipfad"); } catch (Exception exp) { return MessageBox.Show(exp.Message, "Kopier-Fehler", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question); } return DialogResult.OK; }
"goto" verwendet man in C# nur in sehr wenigen Ausnahme-Situationen.
ciao Frank
- Als Antwort vorgeschlagen Pawel Warmuth Mittwoch, 20. Juli 2011 13:07
- Als Antwort markiert Purclot Mittwoch, 20. Juli 2011 13:57