无法处理FaultException
我有一个执行操作的wcf服务。在此操作中可能会出现故障。我已经说过我的服务合同可能有错。
这是下面的代码;
public void Foo() { try { DoSomething(); // throws FaultException<FooFault> } catch (FaultException) { throw; } catch (Exception ex) { myProject.Exception.Throw<FooFault>(ex); } }
在服务合同中;
[FaultException(typeof(FooFault))] void Foo();
当我在运行应用程序时,DoSomething()方法抛出FaultException时,首先在" catch(Exception ex)"行捕获了异常,并在那里中断了。然后当我再次按f5键时,它通常会执行该操作。我不知道为什么会有这种突破?如果不是这样的话,发布会不会有问题?
解决方案
回答
仔细研究捕获的异常。是FaultException <FooFault>还是FaultException?有2个版本的FaultException类:通用和非通用
回答
@yapiskan,
是强类型语言Foo <X>!= Foo。因此,如果我们需要捕获某些异常,请在catch子句中提供确切的类型。
我们可以阅读此MSDN文章,了解有关异常处理的更多信息。
回答
实际上,异常已捕获,但是我们没有注意到它,因为Visual Studio突出显示了下一行,而不是引发异常的行。代替
throw;
与其他几行文字,并查看它们的实际效果。
回答
问题是按声明的顺序检查异常。尝试将Exception catch块放在第一位,我们会看到编译器抱怨:永远不会评估其他catch块。以下代码通常是.Net在情况下所执行的操作:
// 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本质上不是递归的)。
尝试以下方法:
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。
回答
我们是否正在使用Silverlight的WCF服务?如果是这样,则需要进行特殊配置以使服务返回HTTP 200代码(如果出现错误,则返回500)。详细信息在这里:http://msdn.microsoft.com/zh-cn/library/dd470096%28VS.96%29.aspx