2009-06-29 9 views
1

zu behandeln Ich habe eine Frage zur Behandlung von Ausnahme. Ich habe eine Winform, die auf jedem Formular einen Webservice-Proxy zur Datenabfrage und -verarbeitung verwendet. Hier bin ich wirklich verwirrt und habe lange darüber nachgedacht, was besser ist.Um Ausnahme mit jedem Formular oder nur bei Haupt

A. Versuchen Sie bei jedem Aufruf im Webdienst, die Fehlermeldung anzuzeigen, und ermöglichen Sie dem Benutzer, den Vorgang erneut zu versuchen, indem Sie erneut auf die Schaltfläche klicken.

B. Da der Fehler auf dem Web-Service aufgetreten ist und der Fehler wahrscheinlich darauf zurückzuführen war, dass der Web-Service nicht erreichbar war, machen Sie einfach einen generischen Versuch, in der WinMain-Funktion in der Program.cs zu fangen und eine Fehlermeldung, dass Web-Service ist nicht zugänglich, bevor die Anwendung geschlossen wird.

Das Hauptargument in diesem ist A ist benutzerfreundlicher, aber braucht viel versuchen Fangcode. B ist einfacher zu programmieren, lässt aber die Anwendung einfach enden. Ich lehne mich an A, aber versuche, das Netz mit Optionen zu suchen, wie man den Code verringert, der dazu benötigt wird, um dies zu tun. Irgendwelche Ideen da?

+0

Dies ist eine enge Kopie für so viele Fragen zu SO. –

+0

Aber, BTW, warum eine Ausnahme annehmen bedeutet, dass der Dienst nicht verfügbar ist? Der Dienst hat möglicherweise einen Fehler zurückgegeben. –

+0

Zum Zeitpunkt dieses Kommentars sind nur vier Fragen sowohl mit Winforms als auch mit der Ausnahmebehandlung gekennzeichnet. Keiner von ihnen erscheint auf der ersten Suchergebnisseite für eine Google-Suche nach "winforms exception handling" und die einzige SO-Frage, die _does_ erscheint, beantwortet diese Frage nicht. –

Antwort

1

den Webservice Aufruf kapseln und die try/catch-Block innerhalb einer Klasse =)

+0

Meinten Sie, einen Web-Service-Klassen-Wrapper erstellen und auch die Fehlermeldung im Wrapper anzeigen? – Nap

+0

Ja. Sie müssen nicht jeden Aufruf von Webservices innerhalb dieser Klasse tätigen, nur diejenigen, die Ihre Anwendung nicht stoppen dürfen. Haben Sie eine generische Webservice-Client-Klasse? Wenn ja, könnten Sie diese Logik in diesen generischen Webservice-Client einfügen. Wenn Sie dies tun, können Sie in der Implementierungsklasse ein Flag wie 'sentCatchErrorsInWebserviceCall' setzen, um festzustellen, ob es sie abfangen soll oder nicht. – mkato

3

Wenn Sie eine Web-Referenz hinzufügen, fügt der Codegenerator automatisch „Async“ Methoden, um den Web-Dienst zuzugreifen.

Ich würde empfehlen, dass Sie die Async-Methoden anstelle der synchronen Methoden verwenden. Das Schöne daran ist, dass die EventArgs für die Async-Methoden eine Error-Eigenschaft bereitstellen, mit der Sie feststellen können, ob die Anfrage erfolgreich war oder nicht.

private void CheckWebservice(string data) 
{ 
     WebService.Server server = new WebService.server(); 
     server.methodCompleted += server_methodCompleted; 
     server.methodAsync(data); 
} 

private void server_methodCompleted(object sender, methodCompletedEventArgs e) 
{ 
     if (e.Error != null) 
      if (MessageBox.Show("Error", "Error", MessageBoxButtons.AbortRetryIgore) == DialogResult.Retry) 
      { 
       // call method to retry 
      } 
     else 
     { 
      if (e.Result == "OK") { // Great! } 
     } 
} 

Wenn Sie die synchrone Methoden aus irgendeinem Grund verwenden müssen, dann könnte man, natürlich, eine Klasse schreiben, die Methoden zu kapseln Ihre Web-Service zu nennen, so dass Sie es von verschiedenen Orten ohne Duplizieren des Code aufrufen kann . Ihre Kapselungsklasse könnte die gesamte Fehlerbehandlung durchführen und ein Ergebnis zurückgeben.

class CallWebService 
{ 
     public enum Result 
     { Unknown, Success, NotAvailable, InvalidData } // etc 

     public Call(string data) 
     { 
      Webservice.Server server = new Webservice.Server(); 
      string result = string.Empty; 
      try 
      { 
       result = server.getResult(data); 
      } 
      catch (Exception ex) // replace with appropriate exception class 
      { 
       return Result.NotAvailable; 
      } 
      if (result == "OK") return Result.Success 
      else return Result.InvalidData; 
     } 
} 
+0

Ich denke, ich würde meine Anrufe benötigen, um mit der GUI synchron zu sein. – Nap

+0

Wenn Sie die synchronen Methoden verwenden, verwenden Sie sie besser in einem Hintergrundthread oder BackgroundWorker. Wenn Sie sie direkt auf dem GUI-Thread ausführen, kann dies dazu führen, dass Ihre Anwendung nicht mehr reagiert. –

+0

oh. das würde bedeuten, dass ich Multithread machen muss. hmm ... nicht so zum Multithreading geneigt – Nap

Verwandte Themen