关于C#:无法处理FaultException

关于C#:无法处理FaultException

Cannot handle FaultException

我有一个执行操作的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突出显示了下一行,而不是引发异常的行。替换

1
throw;

和其他几行内容,然后查看它们的实际效果。


仔细研究捕获的异常。是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文章,了解有关异常处理的更多信息。


推荐阅读