2009-06-29 5 views
1

J'ai une question sur la gestion des exceptions. J'ai un Winform qui utilise un proxy webservice sur chaque formulaire pour la récupération et le traitement des données. C'est là que je me suis vraiment perdu et que j'ai pris le temps de décider lequel est le meilleur.Pour gérer l'exception avec toutes les formes ou juste au principal

A. Pour chaque appel du service Web, essayez d'afficher le message d'erreur et autorisez l'utilisateur à réessayer le processus en cliquant à nouveau sur le bouton.

B. Étant donné que l'erreur est survenue sur le service Web et que l'erreur était probablement due au fait que le service Web était inaccessible, effectuez un essai générique dans la fonction WinMain dans Program.cs et affichez un message d'erreur indiquant que le service Web est inaccessible avant la fermeture de l'application.

L'argument principal dans ceci est A est plus convivial, mais nécessite beaucoup de code catch. B est plus facile à coder mais laisse simplement l'application se terminer. Je me penche sur A mais j'essaie de chercher sur le net avec des options pour réduire le code nécessaire pour être écrit pour le faire. Des idées là-bas?

+0

Ceci est une copie proche pour tant de questions sur SO. –

+0

Mais, BTW, pourquoi supposer une exception signifie que le service est indisponible? Le service a peut-être renvoyé une erreur. –

+0

Au moment de ce commentaire, seulement quatre questions sont taguées à la fois pour les winforms et les exceptions. Aucun d'entre eux n'apparaît dans la première page de résultats pour une recherche Google sur "winforms gestion des exceptions" et la seule question SO apparaissant ne correspond pas à cette question. –

Répondre

1

encapsulent l'appel webservice et le bloc try/catch dans une classe =)

+0

Voulez-vous dire créer un wrapper de classe de service Web et afficher le message d'erreur dans le wrapper? – Nap

+0

Oui. Vous n'avez pas besoin de mettre tous les appels à webservices dans cette classe, seulement ceux qui ne doivent pas arrêter votre application. Avez-vous une classe de client webservice générique? Si oui, vous pouvez mettre cette logique dans ce client webservice générique. Ce faisant, vous pouvez définir un drapeau comme 'shouldCatchErrorsInWebserviceCall' dans la classe d'implémentation pour indiquer s'il doit les attraper ou non. – mkato

3

Lorsque vous ajoutez une référence Web, le générateur de code ajoute automatiquement les méthodes « Async » pour accéder au service Web.

Je vous recommande d'utiliser les méthodes Async plutôt que les méthodes synchrones. La bonne chose à ce sujet est que les méthodes EventArgs pour les méthodes asynchrones fournissent une propriété Error que vous pouvez utiliser pour voir si la requête a réussi ou non.

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! } 
     } 
} 

Si vous devez utiliser les méthodes synchrones pour une raison quelconque, vous pouvez, bien sûr, écrire une classe pour encapsuler les méthodes pour appeler votre service Web afin que vous puissiez l'appeler à partir de divers endroits sans dupliquer le code . Votre classe d'encapsulation pourrait faire toute la gestion des erreurs et retourner un résultat.

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

Je pense que j'aurais besoin que mes appels soient synchrones avec l'interface graphique. – Nap

+0

Si vous souhaitez utiliser les méthodes synchrones, il vaut mieux les utiliser sur un thread d'arrière-plan ou BackgroundWorker. Les exécuter directement sur le fil de l'interface graphique est une excellente façon de faire en sorte que votre application ne réponde plus. –

+0

oh. cela voudrait dire que je dois le faire multithread. hmm ... pas enclin à multithread – Nap

Questions connexes