Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法处理FaultException_C#_Wcf_Exception - Fatal编程技术网

C# 无法处理FaultException

C# 无法处理FaultException,c#,wcf,exception,C#,Wcf,Exception,我有一个wcf服务,它执行一个操作。在这个操作中可能有故障。我已经声明我的服务合同中可能有错误 下面是代码 public void Foo() { try { DoSomething(); // throws FaultException<FooFault> } catch (FaultException) { throw; }

我有一个wcf服务,它执行一个操作。在这个操作中可能有故障。我已经声明我的服务合同中可能有错误

下面是代码

public void Foo()
{
        try
        {
            DoSomething(); // throws FaultException<FooFault>
        }
        catch (FaultException)
        {
            throw;
        }
        catch (Exception ex)
        {
            myProject.Exception.Throw<FooFault>(ex);
        }
}

当我运行应用程序时,DoSomething()方法抛出一个FaultException时,首先在“catch(exception ex)”行捕获该异常,并在该行中断。然后,当我再次按下f5时,它会执行通常必须执行的操作。我想知道为什么会有这样的突破?如果不是,这可能是发布时的问题吗?

请仔细查看捕获的异常。是FaultException还是FaultException?FaultException类有两个版本:

请仔细查看捕获的异常。是FaultException还是FaultException?FaultException类有两个版本:和

@yapiskan

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

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

@yapiskan

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


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

事实上,您的异常已被捕获,但您没有注意到,因为visual studio突出显示了下一行,而不是引发异常的行。替换

throw;

使用其他一些行并查看它们的运行情况。

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

throw;

使用其他一些行并查看它们的操作。

问题在于,异常是按照声明的顺序进行检查的。尝试将异常捕获块放在第一位,您将看到编译器抱怨:其他捕获块将永远不会被计算。以下代码通常是.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
//开始尝试
DoSomething();//抛出错误异常
//结束尝试
如果(发生例外情况)
{
if(异常为FaultException)//FE catch块。
{
投掷;
//转到出口
}
if(异常为异常)//EX catch块
{
抛出新的FaultException();
//转到出口
}
}
//出口
正如您所见,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;
        }
试试看
{
尝试
{
DoSomething();//引发FaultException
}
捕获(例外情况除外)
{
if(ex是FaultException)
投掷;
其他的
myProject.Exception.Throw(ex);
}
}
捕获(错误异常)
{
投掷;
}

HTH.

问题在于,异常是按照声明的顺序进行检查的。尝试将异常捕获块放在第一位,您将看到编译器抱怨:其他捕获块将永远不会被计算。以下代码通常是.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
//开始尝试
DoSomething();//抛出错误异常
//结束尝试
如果(发生例外情况)
{
if(异常为FaultException)//FE catch块。
{
投掷;
//转到出口
}
if(异常为异常)//EX catch块
{
抛出新的FaultException();
//转到出口
}
}
//出口
正如您所见,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;
        }
试试看
{
尝试
{
DoSomething();//引发FaultException
}
捕获(例外情况除外)
{
if(ex是FaultException)
投掷;
其他的
myProject.Exception.Throw(ex);
}
}
捕获(错误异常)
{
投掷;
}

HTH.

您是否正在使用Silverlight的WCF服务?如果是这样,则需要进行特殊配置,以使服务在出现错误时返回HTTP 200代码,而不是500代码。详细信息如下:

您是否正在使用Silverlight的WCF服务?如果是这样,则需要进行特殊配置,以使服务在出现错误时返回HTTP 200代码,而不是500代码。详细信息如下:

这不起作用。因为抛出线不在try块中,所以它必须被父catch块捕获。这不起作用。因为抛出行不在try块中,所以它必须被父catch块捕获。我知道catch块不是递归的,但是使用您提到的catch块会使代码像楼梯一样,我不喜欢它。我也不明白为什么这个异常没有被捕获。它被捕获了,但存在一个中断,迫使我按f5按钮继续。我知道捕获块不是递归的,但是使用你提到的捕获块会使代码像楼梯一样,我不喜欢它。我也不明白为什么这个异常没有被捕获。它被抓到了,但存在一个中断,迫使我按f5按钮继续。也许你应该仔细看看;)[SerializableAttribute]公共类FaultException:FaultException var fooFault=new FaultException();footfault是FaultException//是真的,所以带有catch(FaultException ex)的catch块将捕获FaultException*刚才看到了您的评论。。。这个评论仍然有误导性,也许你应该仔细看看;)[序列化属性]