我在项目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; }
答案 0 :(得分:2)
WCF不会自动序列化异常,原因有很多(例如,客户端可能用C#以外的其他语言编写,并且运行在与.NET不同的平台上)。
但是,WCF会将一些异常信息序列化为FaultException对象。例如,此基本信息包含异常类名称。如果使用通用FaultException类型,则可以在其中存储一些其他数据。
即FaultException<FaultInfo>
其中FaultInfo
是您的类,用于存储其他异常数据。不要忘记将数据协定序列化属性添加到类属性中。
此外,您应该对应该抛出类型的FaultExceptions的方法应用FaultContract属性。
[OperationContract]
[FaultContract(typeof(FaultInfo))]
void DoSomething();
答案 1 :(得分:1)
那是因为所有异常都包含在FaultException
中。抓住它并查看InnerException
属性
答案 2 :(得分:1)
处理此问题的正确方法是在服务操作合同上定义FaultContract:
[OperationContract]
[FaultContract(typeof(MyException))]
int MyOperation1(int x, int y);
这将允许您的客户端通过将其作为通用FaultException来捕获异常:
try {...}
catch (FaultException<MyException> e) {...}