【问题标题】:WCF Service Falling Through if Statement in catch(Exception ex)WCF 服务在 catch 中的 if 语句失败(异常前)
【发布时间】:2015-06-04 23:52:55
【问题描述】:

我有一个 WCF 服务,在我的一种方法中,我试图抛出一个显式的 FaultException。这个抛出被我的 catch 语句捕获,我的目的是检查异常是否属于我的显式类型,如果是则重新抛出。调试器显示这正在成功发生,但也会在 else 之后抛出新的 FaultException。它是发送给我的客户的通用 FaultException。我无法解释这种行为?

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?
}

【问题讨论】:

  • 你为什么在使用中抛出一个FaultException? FaultException 通常用于指示某种连接问题或类似情况。
  • 不使用调试器时,代码是否能正常运行?
  • @Servy 起初我认为它没有,但看起来你可能已经击中了它的头部。调试器似乎命中了两个断点,但我收到了明确的 FaultException?

标签: c# wcf exception


【解决方案1】:

不幸的是,catch 块中的“if statements”不起作用。你必须像下面这样使用。

无论是否有任何 if 语句,都会抛出每个 throw 语句。

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

【讨论】:

    【解决方案2】:

    您不需要明确地执行此检查。您可以捕获 2 个不同的异常,并为您完成过滤。

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

    【讨论】:

    • 我不认为 OP 的问题是他们不了解异常处理在 .net 中的工作原理。
    猜你喜欢
    • 2017-03-04
    • 2014-05-26
    • 1970-01-01
    • 2012-12-31
    • 2018-02-02
    • 2019-01-26
    • 2013-02-28
    • 2018-11-06
    • 2014-09-09
    相关资源
    最近更新 更多