处理每个表单或主表单的异常

时间:2009-06-29 01:35:47

标签: c# winforms exception-handling

我有一个关于处理异常的问题。我有一个Winform,它在每个表单上使用webservice代理进行数据检索和处理。这是我真的很困惑,很长一段时间决定哪个更好。

一个。对于Web服务中的每个调用,请尝试catch以显示错误消息,并允许用户再次单击该按钮重新尝试该过程。

B中。由于Web服务上发生错误并且错误可能是因为Web服务无法访问,只需在Program.cs中的WinMain函数中创建一个通用的try catch,并在应用程序关闭之前显示一条错误消息,指出Web服务无法访问

这里的主要论点是A更加用户友好,但需要大量的try catch代码。 B更容易编码,但只是让应用程序结束。我倾向于A,但我试图在网上搜索如何减少编写代码所需的代码。那里有什么想法吗?

2 个答案:

答案 0 :(得分:3)

添加Web引用时,代码生成器会自动添加“Async”方法来访问Web服务。

我建议您使用Async方法而不是同步方法。关于这一点的好处是,Async方法的EventArgs提供了一个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! }
      }
 }

如果由于某种原因必须使用同步方法,那么您当然可以编写一个类来封装调用Web服务的方法,以便您可以从各个地方调用它而无需复制代码。您的封装类可以执行所有错误处理并返回结果。

 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 :(得分:1)

将webservice调用和try / catch块封装在class =)