2015-03-31 13 views
1

我有一个WCF服务,在我尝试抛出一个显式的FaultException的方法之一。这个抛出被我的catch语句捕获,我的意图是检查异常是否是我的显式类型,如果是这样抛出。调试器显示这种情况已成功发生,但也会引发在else之后发现的新FaultException。这是通用的FaultException发送到我的客户端。我无法解释这种行为?WCF服务通过if语句捕获(Exception ex)

try 
{ 
    using (var db = new DataContext()) 
    { 
     var obj = GetSomeObject(objectId, db); 

     if (!obj.Conditional) 
      throw new FaultException<ValidateStatusFault>(new ValidateStatusFault { Details = "Object '" + obj.Id + "' has not been some condition.", Issue = "Object '" + obj.Id + "' cannot be validated." }); 

     // Additional checks. 
    } 
} 
catch (Exception ex) 
{ 
    if (ex is FaultException<ValidateStatusFault>) 
     throw; // I reach this breakpoint successfully. 
    else 
     throw new FaultException(ex.Message); // I also reach this breakpoint? 
} 
+0

为什么在使用中抛出一个FaultException? FaultException通常用于指示某种连接问题或类似的情况。 – CoderForHire 2015-03-31 15:19:38

+0

不使用调试器时,它的代码功能应该如何? – Servy 2015-03-31 15:27:55

+0

@Servy起初我以为它没有,但似乎你可能已经击中了它的头。看起来调试器命中两个断点,但我收到显式的FaultException? – 2015-03-31 15:36:11

回答

1

不幸的是,'if语句'在catch块中不起作用。你必须像下面一样使用。

无论if语句如何,每一个throw语句都会被抛出。

try { 
    tryStatements 
} 
catch(FaultException<ValidateStatusFault> faultException){ 
    catchStatements 
} 
catch(Exception ex) 
{ 
    throw new FaultException(ex.Message); 
} 
finally { 
    finallyStatements 
} 
0

你不需要明确地做这个检查。您可以捕获2个不同的例外,并为您完成过滤。

try 
{ 
} 
catch (FaultException<ValidateStatusFault> faultException) 
{ 
     throw; // I reach this breakpoint successfully. 

} 
catch(Exception ex) 
{ 
    throw new FaultException(ex.Message); 
} 
+1

我不认为OP的问题是他们不了解如何在.net中处理异常。 – 2015-04-01 16:19:40