3

わかりました、私はここで何かが欠けていることを知っています。以下の運用契約を結んでいます。

public double DivideByZero(int x, int y)
{                   
    if (y == 0) 
    { 
        throw new FaultException<ArgumentException>
          (new ArgumentException("Just some dummy exception")
          ,new FaultReason("some very bogus reason"), new FaultCode("007"));
    }
    return x / y;
}

そして、以下はクライアントから取られます:-

  Console.WriteLine("Enter the x value");
  string x = Console.ReadLine();
  Console.WriteLine("Enter the Y value");
  string y = Console.ReadLine();
  try
  {
      double val = client.DivideByZero(Convert.ToInt32(x), Convert.ToInt32(y));
      Console.WriteLine("The result is " + val.ToString());
  }
  catch(FaultException<ArgumentException> exp)  
  {
      Console.WriteLine("An ArgumentException was thrown by the service "+ exp.ToString());    
  }
  catch (Exception exp)
  {
      Console.WriteLine(exp.ToString());
  }

上記の場合、catch(FaultException exp) (クライアント コード内の ArgumentException を持つ最初の catch ブロック) ブロックは実行されません。ただし、ArgumentException を削除して catch(FaultException exp) を指定すると、同じ catch ブロックが実行されます。操作コントラクトから FaultException をスローしているため、これについてはわかりません。ここに何か欠けていますか?

あなたの助けに感謝します、アシッシュ

編集:-クライアントでサービス参照を更新すると、FaultException<ArgumentException>例外をキャッチできました。

4

2 に答える 2

3

FaultException<DataContract>任意のデータ コントラクト タイプで試してみてください。ArgumentExceptionプロキシ クラスのフォールトに対して生成されたコードを見ると、期待どおりにシリアル化されていないことがわかるでしょう。

于 2010-06-13T13:18:32.387 に答える
0

Exception クラスを派生させている場合は、カスタム例外にシリアライゼーション コンストラクターがあることを確認してください。

protected MyCustomException(
          SerializationInfo info,
          StreamingContext context)
            : base(info, context) { }
于 2011-08-09T00:34:34.613 に答える