【问题标题】:To handle exception with every form or just at main处理每个表单的异常或仅在 main
【发布时间】:2009-06-29 01:35:46
【问题描述】:

我有一个关于处理异常的问题。我有一个 Winform,它在每个表单上使用 web 服务代理进行数据检索和处理。这是我真正感到困惑的地方,并且花了很长时间才决定哪个更好。

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

B.由于错误发生在 Web 服务上并且错误可能是因为 Web 服务不可访问,只需在 Program.cs 的 WinMain 函数中进行通用 try catch 并在应用程序关闭之前显示 Web 服务不可访问的错误消息.

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

【问题讨论】:

  • 这与 SO 上的许多问题非常相似。
  • 但是,顺便说一句,为什么假设异常意味着服务不可用?服务可能返回了错误。
  • 在发表此评论时,只有四个问题被标记为 winforms 和异常处理。它们都没有出现在“winforms 异常处理”的谷歌搜索结果的第一页中,并且确实出现的唯一 SO 问题没有解决这个问题。
  • SO-意思是面向服务?

标签: c# winforms exception-handling


【解决方案1】:

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

我建议您使用异步方法而不是同步方法。这样做的好处是 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;
      }
 }

【讨论】:

  • 我想我的调用需要与 GUI 同步。
  • 如果你打算使用同步方法,那么你最好在后台线程或BackgroundWorker上使用它们。直接在 GUI 线程上运行它们是导​​致应用程序无响应的好方法。
  • 哦。这意味着我需要使它成为多线程。嗯...不太倾向于多线程
  • 后台工作者类真的很容易使用。是的,它是多线程的,但一点也不复杂。
【解决方案2】:

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

【讨论】:

  • 您的意思是创建一个 Web 服务类包装器并在包装器中显示错误消息吗?
  • 是的。您不需要将每个对 web 服务的调用都放在这个类中,只有那些不能停止您的应用程序的调用。你有一个通用的 web 服务客户端类吗?如果是,您可以将此逻辑放在这个通用 Web 服务客户端中。这样做,你可以在实现类中设置一个像'shouldCatchErrorsInWebserviceCall'这样的标志来告诉它是否应该捕获它们。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多