Не удается обработать FaultException

У меня есть служба 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();

когда FaultException вызывалось методом DoSomething() во время работы приложения, сначала исключение было перехвачено в строке "catch(Exception ex)" и разрывалось там. затем, когда я снова нажал клавишу f5, он делает то, что обычно должен. Интересно, почему этот разрыв существует? а если нет, может ли это быть проблемой при публикации?

5 ответов

Вы используете сервис WCF от Silverlight? Если это так, необходима специальная конфигурация, чтобы служба возвращала код HTTP 200 вместо 500 в случае ошибки. Подробности здесь: http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx

На самом деле ваше исключение обнаруживается, но вы не замечаете его, поскольку Visual Studio выделяет следующую строку, а не строку, которая выдает исключение. замещать

throw;

с некоторыми другими линиями и увидеть их в действии.

Присмотритесь к уловленному исключению. Было ли это FaultException или FaultException? Есть 2 версии класса FaultException: универсальная и не универсальная

Проблема в том, что исключения проверяются в порядке их объявления. Попробуйте сначала поставить блок catch Exception, и вы увидите, что компилятор жалуется: другие блоки 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;
        }

НТН.

@yapiskan,

C# - строго типизированный язык Foo!= Foo. Поэтому, если вам нужно поймать какое-то исключение, укажите точный тип в предложении catch.

Вы можете узнать больше об обработке исключений, прочитав эту статью MSDN.

Другие вопросы по тегам