Не удается обработать FaultException - PullRequest
1 голос
/ 07 сентября 2008

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

2 голосов
/ 09 декабря 2009

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

1 голос
/ 12 ноября 2008

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

throw;

с некоторыми другими строками и посмотрите их в действии.

0 голосов
/ 17 ноября 2008

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

НТН.

0 голосов
/ 07 сентября 2008

@ yapiskan

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

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

0 голосов
/ 07 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...