1

操作を行う wcf サービスがあります。この操作でエラーが発生する可能性があります。サービス契約に誤りがある可能性があると述べました。

以下のコードは次のとおりです。

public void Foo()
{
        try
        {
            DoSomething(); // throws FaultException<FooFault>
        }
        catch (FaultException)
        {
            throw;
        }
        catch (Exception ex)
        {
            myProject.Exception.Throw<FooFault>(ex);
        }
}

サービス契約で;

[FaultException(typeof(FooFault))]
void Foo();

アプリケーションの実行中に DoSomething() メソッドによって FaultException がスローされた場合、最初に「catch(Exception ex)」行で例外がキャッチされ、そこで中断されました。次に、もう一度 f5 を押すと、通常どおりに実行されます。なぜその休憩が存在するのだろうか?そうでない場合は、公開時に問題になる可能性がありますか?

4

5 に答える 5

2

Silverlight から WCF サービスを利用していますか? その場合、サービスがエラーの場合に 500 ではなく HTTP 200 コードを返すようにするには、特別な構成が必要です。詳細はこちら: http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx

于 2009-12-09T09:02:05.970 に答える
1

実際には例外がキャッチされますが、例外をスローする行ではなく、ビジュアルスタジオが次の行を強調表示するため、それに気付かない. 交換

throw;

他のいくつかの行を使用して、実際の動作を確認してください。

于 2008-11-12T15:03:11.020 に答える
0

キャッチされた例外を詳しく見てください。FaultException< FooFault> または FaultException でしたか? FaultException クラスには、ジェネリック非ジェネリックの 2 つのバージョンがあります。

于 2008-09-07T11:45:20.120 に答える
-1

@ヤピスカン、

C# は強力な型付き言語 Foo< X> != Foo です。したがって、例外をキャッチする必要がある場合は、 catch句で正確なタイプを指定してください。

例外処理の詳細については、このMSDN 記事を参照してください。

于 2008-09-07T13:12:09.710 に答える
-1

問題は、例外が宣言された順序でチェックされることです。最初に Exception catch ブロックを配置してみると、コンパイラが文句を言うことがわかります。他の catch ブロックは決して評価されません。次のコードは、通常、あなたのケースで .Net が行っていることです。

        // Begin try
             DoSomething(); // throws FaultException<FooFault>
        // End try
        if (exceptionOccured)
        {
            if(exception is FaultException) // FE catch block.
            {
                throw;
                // Goto Exit
            }
            if(exception is Exception) // EX catch block
            {
                throw new FaultException<FooFault>();
                // Goto Exit
            }
        }

        // Exit

ご覧のとおり、FaultException が try-catch-finally に再入力されることはありません (つまり、try-catch-finally は本質的に再帰的ではありません)。

代わりにこれを試してください:

        try
        {
            try
            {
                DoSomething(); // throws FaultException<FooFault>
            }
            catch (Exception ex)
            {
                if (ex is FaultException<FooFault>)
                    throw;
                else
                    myProject.Exception.Throw<FooFault>(ex);
            }
        }
        catch (FaultException)
        {
            throw;
        }

HTH。

于 2008-11-17T09:41:38.993 に答える