这感觉就像一个愚蠢的问题,但我有一个控制台应用程序应该抛出和处理自定义异常类型。由于某种原因,它正在落入一般的异常捕获,我不知道为什么。
主程序:
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;
}
}
答案 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();
}
当我设置超时值时,我想确保如果发生超时异常,那么任何连接都会正常关闭。