C# 无法处理FaultException
我有一个wcf服务,它执行一个操作。在这个操作中可能有故障。我已经声明我的服务合同中可能有错误 下面是代码C# 无法处理FaultException,c#,wcf,exception,C#,Wcf,Exception,我有一个wcf服务,它执行一个操作。在这个操作中可能有故障。我已经声明我的服务合同中可能有错误 下面是代码 public void Foo() { try { DoSomething(); // throws FaultException<FooFault> } catch (FaultException) { throw; }
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
阅读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*刚才看到了您的评论。。。这个评论仍然有误导性,也许你应该仔细看看;)[序列化属性]