Для обработки исключений с каждой формой или только на главной - PullRequest
1 голос
/ 29 июня 2009

У меня есть вопрос об обработке исключений. У меня есть Winform, который использует прокси-сервер веб-службы в каждой форме для извлечения и обработки данных. Здесь я действительно запутался и долго решал, что лучше.

A. Для каждого вызова в веб-сервисе сделайте попытку, чтобы отобразить сообщение об ошибке и позволить пользователю повторить процесс, нажав кнопку еще раз.

B. Так как ошибка произошла в веб-сервисе, и ошибка, вероятно, была вызвана тем, что веб-сервис был недоступен, просто сделайте общий перехват попытки в функции WinMain в Program.cs и покажите сообщение об ошибке, что веб-сервис недоступен до закрытия приложения .

Основным аргументом в этом является то, что A более удобен для пользователя, но требует много попыток поймать код. B легче кодировать, но позволяет приложению завершиться. Я опираюсь на А, но пытаюсь найти в сети варианты, как уменьшить код, который нужно было написать для этого. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 29 июня 2009

Когда вы добавляете веб-ссылку, генератор кода автоматически добавляет методы «Async» для доступа к веб-службе.

Я бы рекомендовал использовать асинхронные методы, а не синхронные. Приятно то, что EventArgs для методов Async предоставляют свойство Error, которое вы можете использовать, чтобы увидеть, был ли запрос успешным или нет.

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

Если вам по какой-то причине необходимо использовать синхронные методы, то вы, конечно, могли бы написать класс для инкапсуляции методов для вызова вашего веб-сервиса, чтобы вы могли вызывать его из разных мест без дублирования кода. Ваш класс инкапсуляции может выполнить всю обработку ошибок и вернуть результат.

 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;
      }
 }
1 голос
/ 29 июня 2009

Инкапсулировать вызов веб-службы и блок try / catch внутри класса =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...