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 があった場合、チャネルのステータスを確認できなかったことがわかりました。すなわち。開いていたら閉じたかった。finally ブロックで例外をスローしていました:)

代わりに、factory.abort() を呼び出すだけです。

finally
{
   factory.Abort();
}

タイムアウト値を設定したので、タイムアウト例外が発生した場合に接続が適切に閉じられたことを確認したかったのです。

于 2012-09-25T02:06:05.280 に答える