Не удается обработать 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();

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
5 274
5

Ответы 5

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

возможно, ты следует присмотреться;) [SerializableAttribute] открытый класс FaultException <TDetail>: FaultException var fooFault = new FaultException <Foo> (); fooFault is FaultException; // истинно, поэтому блок catch с catch (FaultException ex) перехватит FaultException <Foo> * только что видел ваши комментарии выше ... этот комментарий все еще вводит в заблуждение

RhysC 22.12.2009 06:08

@yapiskan,

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

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

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

throw;

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

Это не работает. Поскольку строка throw не находится в блоке try, она должна быть перехвачена родительским блоком catch.

Ali Ersöz 13.11.2008 16:55

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

HTH.

Я знал, что блоки catch не рекурсивны, но использование блоков catch, как вы упомянули, сделает код похожим на лестницу, и мне это не нравится. И я не понимаю, почему исключение не улавливается. Он пойман, но там есть перерыв, который заставляет меня нажать кнопку f5, чтобы продолжить.

Ali Ersöz 17.11.2008 12:51

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

это более актуально для SL4: msdn.microsoft.com/en-us/library/ee844556(VS.95).aspx

Simon_Weaver 16.11.2010 10:11

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