从WCF捕获自定义异常

时间:2013-08-20 09:10:17

标签: c# wcf exception custom-exceptions

我在项目A中有一个Custom类,InvalidCodeException

public class InvalidCodeException : Exception
    {
        public InvalidCodeException ()
        {
        }
        public InvalidCodeException (string message)
            : base(message)
        {            
        }

        public InvalidCodeException (string message, Exception innerException)
            : base(message, innerException)
        {

        }
    }

项目B中的WCF服务。 项目C中的客户端。 项目A在项目B和C中引用。

我从Project B抛出InvalidCodeException并在Project C中捕获。 问题是,当调试时,异常没有捕获

catch (InvalidCodeException ex)
{
  Trace.WriteLine("CustomException");
  throw;
}

但在

catch (Exception ex)
{ throw; }

3 个答案:

答案 0 :(得分:2)

WCF不会自动序列化异常,原因有很多(例如,客户端可能用C#以外的其他语言编写,并且运行在与.NET不同的平台上)。

但是,WCF会将一些异常信息序列化为FaultException对象。例如,此基本信息包含异常类名称。如果使用通用FaultException类型,则可以在其中存储一些其他数据。 即FaultException<FaultInfo>其中FaultInfo是您的类,用于存储其他异常数据。不要忘记将数据协定序列化属性添加到类属性中。

此外,您应该对应该抛出类型的FaultExceptions的方法应用FaultContract属性。

[OperationContract]
[FaultContract(typeof(FaultInfo))]
void DoSomething();

答案 1 :(得分:1)

那是因为所有异常都包含在FaultException中。抓住它并查看InnerException属性

MSDN Article

答案 2 :(得分:1)

处理此问题的正确方法是在服务操作合同上定义FaultContract

[OperationContract]
[FaultContract(typeof(MyException))]
int MyOperation1(int x, int y);

这将允许您的客户端通过将其作为通用FaultException来捕获异常:

try {...}
catch (FaultException<MyException> e) {...}