无法处理FaultException

时间:2008-09-07 11:41:41

标签: c# wcf exception

我有一个执行操作的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时,它会执行通常所需的操作。我想知道为什么这个突破存在?如果没有,那么在发布时会出现问题吗?

5 个答案:

答案 0 :(得分:2)

您是否正在使用Silverlight的WCF服务?如果是这样,则需要特殊配置以使服务在发生错误时返回HTTP 200代码而不是500代码。详细信息如下:http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx

答案 1 :(得分:1)

实际上您的异常被捕获但是您没有注意到它,因为visual studio突出显示下一行,而不是引发异常的行。取代

throw;

使用其他一些行并查看它们的实际效果。

答案 2 :(得分:0)

仔细查看catched异常。是故障异常&lt; FooFault&GT;还是FaultException? FaultException类有2个版本:genericnon-generic

答案 3 :(得分:-1)

@yapiskan,

C#是强类型语言Foo&lt; X&GT; != Foo。因此,如果您需要捕获一些异常,请在 catch 子句中提供 exact 类型。

您可以了解有关阅读this MSDN文章的异常处理的更多信息。

答案 4 :(得分:-1)

问题是异常按照声明的顺序进行检查。首先尝试放置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。