1

我有一个执行操作的 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 时,它会执行通常的操作。我想知道为什么存在这种中断?如果不是,发布时会出现问题吗?

4

5 回答 5

2

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

于 2009-12-09T09:02:05.970 回答
1

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

throw;

与其他一些线,并看到他们的行动。

于 2008-11-12T15:03:11.020 回答
0

仔细看看捕获的异常。是 FaultException< FooFault> 还是 FaultException ?FaultException 类有 2 个版本:泛型非泛型

于 2008-09-07T11:45:20.120 回答
-1

@yapiskan,

C# 是一种强类型语言 Foo< X> != Foo。因此,如果您需要捕获一些异常,请在catch子句中提供确切的类型。

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

于 2008-09-07T13:12:09.710 回答
-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。

于 2008-11-17T09:41:38.993 回答