【问题标题】:Catch all WCF exceptions in a single catch statement在单个 catch 语句中捕获所有 WCF 异常
【发布时间】:2014-05-26 15:25:18
【问题描述】:
  1. 是否可以在单个 catch 语句中捕获所有 WCF 语句? - 即在下面的代码中,我有 2 个 WCF 捕获,但我的代码对两者的反应是相同的,所以我不想重复代码
  2. 两个 WCF 都会捕获、捕获所有 WCF 错误还是我遗漏了任何错误?

注意我已经看到了这些列表here

try
       {
        // Some code......
       }
       catch (CommunicationException exception) // WCF Exception 
            {

            }

      catch (TimeoutException exception) // WCF Exception - 
            {

            }

      catch (Exception ex)
            {
                // Standard exception
            }

【问题讨论】:

  • 谢谢 - 它回答了第 1 项,但没有回答第 2 项
  • 这是用于 WCF 客户端还是服务器?您的方法会因答案而异。请查看此 MSDN 文章:bit.ly/1lXorLn,因为无论哪种情况,它都会对您有所帮助。
  • @PeterB 这是给客户的

标签: c# wcf wcf-security


【解决方案1】:

在 WCF 客户端中,您可以捕获从捕获 FaultException 的服务引发的异常。如果您需要特殊处理(即 TimeoutException 或 CommunicationException),您还可以捕获任何其他类型的错误。

这是一个例子:

proxy ServiceClient();
try
{
    proxy = new ServiceClient();
    proxy.DoSomething();
}
catch (FaultException ex)
{
   // handle errors returned by WCF service
}
catch (CommunicationException ex)
{
  // handle communication errors here 
}
catch (TimeOutException ex)
{
  // handle timeouts here 
}
catch (Exception ex)
{
  // handle unaccounted for exception here 
}
finally
{
   if (proxy.State == CommunicationState.Opened)
   {
      proxy.Close();
   }
   else
   {
      proxy.Abort();
   }     
}

【讨论】:

  • 我已更新以显示其他异常。 CommunicationException 和 TimeoutException 涵盖了 WCF 线级错误。
  • 查看 System.ServiceModel 命名空间中定义的异常。有一堆。见msdn.microsoft.com/en-us/library/…。此外,在您的常规异常捕获块中,您可以记录异常类型,以发现您可能需要特殊错误处理的任何常见异常。
  • 据我所知,您上面的列表捕获了所有异常(尤其是 CommunicationException 包含大多数异常),但我不知道,该链接也没有提及,我看不出列出所有故障模式的意义如果我可以将它们覆盖到 3 岁以下,那么对于 WCF 的所有故障模式,要采取的操作都是相同的。
  • 这真的归结为您希望以特殊方式处理哪些异常。你是对的,几乎所有的 WCF 异常都派生自 CommunicationException,所以除非你想对 ProtocolException 之类的东西采取特殊的行动,否则你不需要用所有可能的异常来混淆你的代码。
猜你喜欢
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2013-07-29
  • 2019-12-17
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多