1

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

主程序:

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

    }
4

2 回答 2

0

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

try 
{ 
   ...
}
catch(Exception ex)
{
     if (ex is TimeoutException)
     {
        ...
     }
     else if (ex is SearchAnticipatedException)
     {
        ...
     }
     else
     {
         ...
     }
}
finally
{
}
于 2012-09-25T01:46:38.057 回答
0

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

相反,我只是要调用 factory.abort()。

finally
{
   factory.Abort();
}

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

于 2012-09-25T02:06:05.280 回答