我有一个执行操作的wcf服务。在此操作中可能会出现故障。我已经说过我的服务合同可能有错。
这是下面的代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public void Foo()
{
try
{
DoSomething(); // throws FaultException<FooFault>
}
catch (FaultException)
{
throw;
}
catch (Exception ex)
{
myProject.Exception.Throw<FooFault>(ex);
}
} |
服务合同中的
;
1 2
| [FaultException(typeof(FooFault))]
void Foo(); |
当我在运行应用程序时,DoSomething()方法引发FaultException时,首先在" catch(Exception ex)"行捕获了该异常,并在那里中断了该异常。然后当我再次按f5键时,它通常会执行该操作。我想知道为什么存在这种突破?如果不是,那么发布时可能会出现问题吗?
您是否正在使用Silverlight的WCF服务?如果是这样,则需要进行特殊配置以使服务返回HTTP 200代码(如果出现错误,则返回500)。详细信息在这里:http://msdn.microsoft.com/zh-cn/library/dd470096(VS.96).aspx
实际上,您的异常已捕获,但是您没有注意到它,因为Visual Studio突出显示了下一行,而不是引发异常的行。替换
和其他几行内容,然后查看它们的实际效果。
仔细研究捕获的异常。是FaultException 还是FaultException?有2个版本的FaultException类:通用和非通用
问题在于,按照声明的顺序检查异常。尝试将Exception catch块放在第一位,您会看到编译器抱怨:永远不会评估其他catch块。以下代码通常是.Net在您的情况下所执行的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // Begin try
DoSomething(); // throws FaultException<FooFault>
// End try
if (exceptionOccured)
{
if(exception is FaultException) // FE catch block.
{
throw;
// Goto Exit
}
if(exception is Exception) // EX catch block
{
throw new FaultException<FooFault>();
// Goto Exit
}
}
// Exit |
如您所见,FaultException永远不会重新输入try-catch-finally(即try-catch-finally本质上不是递归的)。
尝试以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| try
{
try
{
DoSomething(); // throws FaultException<FooFault>
}
catch (Exception ex)
{
if (ex is FaultException<FooFault>)
throw;
else
myProject.Exception.Throw<FooFault>(ex);
}
}
catch (FaultException)
{
throw;
} |
HTH。
@yapiskan,
C#是强类型语言Foo != Foo。因此,如果您需要捕获某些异常,请在catch子句中提供确切的类型。
您可以阅读此MSDN文章,了解有关异常处理的更多信息。