none
Retry-Prozedur schreiben RRS feed

  • 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.
    Mittwoch, 20. Juli 2011 11:33

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
    Mittwoch, 20. Juli 2011 11:56
    Moderator
  • 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
    Mittwoch, 20. Juli 2011 12:13

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
    Mittwoch, 20. Juli 2011 11:56
    Moderator
  • 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
    Mittwoch, 20. Juli 2011 12:13
  • Hallo Marcel, Hallo Frank,

    vielen Dank für die perfekten Code-Beispiele!

    Gruß
    P.
    Mittwoch, 20. Juli 2011 13:58