无法处理故障异常

Posted

技术标签:

【中文标题】无法处理故障异常【英文标题】:Cannot handle FaultException 【发布时间】:2010-09-08 01:55:42 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这对于 SL4 来说是最新的:msdn.microsoft.com/en-us/library/ee844556(VS.95).aspx【参考方案2】:

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

throw;

还有一些其他的线,看看它们的实际效果。

【讨论】:

这不起作用。因为 throw 线不在 try 块中,所以它必须被父 catch 块捕获。【参考方案3】:

仔细查看捕获的异常。是 FaultException 还是 FaultException ? FaultException 类有 2 个版本:generic 和 non-generic

【讨论】:

也许应该仔细看看;) [SerializableAttribute] public class FaultException : FaultException var fooFault = new FaultException(); fooFault is FaultException;//是真的,所以使用 catch (FaultException ex) 的 catch 块会捕获 FaultException *刚刚在上面看到了你的 cmets...这个评论仍然具有误导性【参考方案4】:

@yapiskan,

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

我知道 catch 块不是递归的,但是使用你提到的 catch 块会使代码像楼梯一样,我不喜欢它。而且我不知道为什么没有捕获到异常。它被抓住了,但那里有一个中断,迫使我按 f5 按钮继续。

以上是关于无法处理故障异常的主要内容,如果未能解决你的问题,请参考以下文章

kafka故障排查-consumer处理超时导致的异常

Linux启动故障处理

签名验证失败。无法匹配“孩子”

jedis订阅发布故障处理

处理coredns Pending故障

Elasticsearch未分配分片异常处理