0

我在项目 A 中有一个自定义类 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 中的客户端。项目 B 和 C 中引用了项目 A。

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

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

但在

catch (Exception ex)
{ throw; }
4

3 回答 3

2

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

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

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

[OperationContract]
[FaultContract(typeof(FaultInfo))]
void DoSomething();
于 2013-08-20T23:18:08.113 回答
1

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

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

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

try {...}
catch (FaultException<MyException> e) {...}
于 2013-08-20T13:14:38.600 回答
1

那是因为所有异常都包含在FaultException. 抓住它,看看InnerException属性

MSDN 文章

于 2013-08-20T09:20:48.543 回答