.NET自定义异常未被捕获到预期的位置

时间:2012-09-25 01:21:08

标签: .net exception-handling

这感觉就像一个愚蠢的问题,但我有一个控制台应用程序应该抛出和处理自定义异常类型。由于某种原因,它正在落入一般的异常捕获,我不知道为什么。

主程序:

try
{
    result = MyService.ExecuteSearch(paramItems);
}
catch (TimeoutException ex)
{
    // Catch time out exceptions here
}
catch (SearchAnticipatedException ex)
{
    // THIS IS WHERE I WANT TO BE WITH MY CUSTOM EXCEPTION & MESSAGE
}
catch (Exception ex)
{
    // THE ORIGINAL EXCEPTION IS BEING CAUGHT HERE 
}

我的逻辑的主要内容捕获了一个EndpointNotFoundException并且我正在尝试而不是抛出那个 - 用更有意义的消息(以及其他信息)抛出我的自定义异常。但相反,原始的endpoingnotfoundexception正在Catch(Exception ex)块中处理。

 try
 {
          // do some logic
          ((IClientChannel)proxy).Close();
 }
 catch (CommunicationObjectFaultedException ex)
 {
      throw new SearchAnticipatedException(ServiceState.Critical, hostName, ex);
 }
 catch (EndpointNotFoundException ex)
 {
      throw new SearchAnticipatedException(ServiceState.Critical, hostName, ex);
 }
 finally
 {
    if (((IClientChannel)proxy).State == CommunicationState.Opened)
    {
         factory.Abort();
         ((IClientChannel)proxy).Close();
    }
 }

如果我在主要部分的底部注释掉一般异常,那么它会被正确的块捕获 - 我认为它会被更具体的异常首先捕获,如果它与那些不匹配,它会属于最后一般障碍。

希望这只是我填充的小东西:)

我的异常类看起来像:

 class SearchAnticipatedException : System.Exception
    {
        public int ServiceStateCode { get; set; }

        public SearchAnticipatedException(MyService.ServiceState serviceState, string message, Exception innerException)
            : base(message, innerException)
        {
            ServiceStateCode = (int)serviceState;
        }

        public static string FormatExceptionMessage(string message, MyService.ServiceState serviceState)
        {
            return serviceState.ToString().ToUpper() + SearchResult.CODE_MESSAGE_DELIMITER + message;
        }

    }

2 个答案:

答案 0 :(得分:0)

我不确定,因为我认为第一个匹配的catch子句优先,但如果你这样做,你可能会取得更大的成功:

try 
{ 
   ...
}
catch(Exception ex)
{
     if (ex is TimeoutException)
     {
        ...
     }
     else if (ex is SearchAnticipatedException)
     {
        ...
     }
     else
     {
         ...
     }
}
finally
{
}

答案 1 :(得分:0)

想出来 - 事​​实证明,如果有一个endpointNoutFoundException,那么我无法检查频道的状态。即。如果它是开放的我想关闭它。它在finally块中抛出异常:)

相反,我只是打电话给factory.abort()。

finally
{
   factory.Abort();
}

当我设置超时值时,我想确保如果发生超时异常,那么任何连接都会正常关闭。