Donnerstag, 3. April 2008

Wie beende ich eine Applikation richtig?

Aus aktuellem Anlass hier mal etwas sehr grundlegendes, was einem in manchen Situationen aber absolut nicht einfallen will - eventuell, weil es zu einfach ist? ;)

Problemstellung:
Wir haben innerhalb eines FormLoad-EventHandlers eine Verzweigung, die entweder den EventHandler rekursiv aufruft, oder die Applikation beendet.

Lösungsansatz:
Für den Fall, dass die Applikation beendet werden soll, wird einfach ein Application.Exit() aufgerufen. Klingt ja so weit schön einfach. Wird aber ein folgendes Konstrukt zusammengestöpselt, erleben wir eine Überraschung.

   1:  Form1_Load(object sender, EventArgs e)
   2:  {
   3:      int retry = 0;
   4:   
   5:      try
   6:      {
   7:          string s = IrgendeinAufruf();
   8:      }
   9:      catch(Exception)
  10:      {
  11:          retry++;
  12:   
  13:          if(retry < 4) // 3 Versuche
  14:          {
  15:              Form1_Load(sender, e);
  16:          }
  17:          else
  18:          {
  19:              Application.Exit();
  20:          }
  21:      }
  22:   
  23:      MacheIrgendwasMitEinemString(s);
  24:  }

Hier werden wir eine NullReferenceException erhalten, denn das Application.Exit() wirkt nicht sofort, was dazu führt, dass die Methode 'MacheIrgendwasMitEinemString' auch noch ausgeführt wird, wobei der String natürlich nicht initialisiert wurde.

Die Lösung des Problems ist ein kleines, süßes, nützliches, gewöhnliches 'return', wodurch der korrekt funktionierende Code dann so aussieht:

   1:  Form1_Load(object sender, EventArgs e)
   2:  {
   3:      int retry = 0;
   4:   
   5:      try
   6:      {
   7:          string s = IrgendeinAufruf();
   8:      }
   9:      catch(Exception)
  10:      {
  11:          retry++;
  12:   
  13:          if(retry < 4) // 3 Versuche
  14:          {
  15:              Form1_Load(sender, e);
  16:          }
  17:          else
  18:          {
  19:              Application.Exit();
  20:              return;
  21:          }
  22:      }
  23:   
  24:      MacheIrgendwasMitEinemString(s);
  25:  }

Schlußfolgerung:
Würdigt das RETURN, hegt es, pflegt es und vor allem: nutzt es da, wo es nötig ist! ;)

1 Kommentar:

Tropensturm hat gesagt…

Ja ja ja ich gebs ja zu ist eine Anspielung auf mich :P thx für den Fix und die Erklärung ;)