SoapException не пойман в попытке поймать

Возьмите следующий оператор try-catch в WCF-Service

    Try
        'Here some method is being called.
        Return myBs.PerformDailyUpdate()

    Catch ex As Exception 'Exception is not being caught here
        If service IsNot Nothing AndAlso service.HasWarnings Then
            TextFileTracer.Write(String.Format("Warning in method: '{0}'.", name))
            TextFileTracer.Write(service.GetWarnings)
        End If
        Try
            TextFileTracer.Write("Error in dbmanager: " & service.HasErrors.ToString)
        Catch ex2 As Exception
        End Try
        TextFileTracer.Write(String.Format("Error in method: '{0}'.", name))
        TextFileTracer.Write(ex.Message & vbCrLf & ex.StackTrace)
    End Try
End Function 'Exception shows here while debugging

В этом методе (PerformDailyUpdate) вызывается ASMX-Webservice (.Net 2.0). Этот веб-сервис иногда выдает SOAPException, вызванный методом, вызываемым из этого веб-сервиса. Однако каким-то образом это исключение SOAPException не перехватывается описанным выше методом.

Мой вопрос: почему SOAPException не перехватывается? Существуют ли какие-то характеристики, которые отделяют SOAP-Exception от обычных сгенерированных «исключений» (которые, в свою очередь, приводят к тому, что оно не перехватывается)?

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

Сообщение об исключении (первая часть)

  System.Web.Services.Protocols.SoapException: Unexpected application error: SqlException.
  ADF.ExceptionHandling.GlobalExceptions.UnexpectedException: Unexpected application error: SqlException.
  System.Data.SqlClient.SqlException: Incorrect syntax near ')'.
  at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
  at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
  ....

Спасибо

Scheme (how this clarifies the situation somewhat):

Internal DailyTriggerMechanism  -----> WCF - Service  ----->  ASMX-Webservice        ----> DB2/SQL
                                     (Origin code above)    (Exception being thrown)

Внутри службы WCF полученные данные обрабатываются для заполнения определенных таблиц. В этой ситуации AMSX-Webservice может не измениться.


person User999999    schedule 30.01.2014    source источник
comment
Является ли это случаем, когда ошибка SOAP возникает на хосте, но вы пытаетесь отловить ее на клиенте? Трудно сказать по описанию.   -  person Brian    schedule 30.01.2014
comment
Я отредактирую свой пост, чтобы прояснить ситуацию.   -  person User999999    schedule 30.01.2014
comment
Прежде всего, если вы используете ссылку на сервис (а вы должны), то вы получите FaultException или, может быть, FaultException<T>, а не SoapException. Во-вторых, если catch (Exception ex) не перехватывает исключение, это означает, что исключение не было выброшено.   -  person John Saunders    schedule 30.01.2014
comment
добавлена ​​первая часть данного исключения   -  person User999999    schedule 30.01.2014


Ответы (1)


Я думаю, что обычное исключение должно быть в состоянии поймать указанную вами необработанную ошибку, но вы можете попробовать исключение, связанное с SOAP и/или SQL, в дополнение к вашему обычному исключению.

Нравиться:

try {
    //your failing code
} 
catch (SOAPException se) 
{
   //your response    }
catch (SQLException sqle) 
{
   //your response     
}
catch (Exception e) 
{
   //your response     
}
person Brian    schedule 30.01.2014
comment
Постараюсь сделать это. Возможно, идиотский и / или глупый вопрос (просто хочу охватить здесь все свои базы). Изображение У меня есть пользовательское исключение, унаследованное от SOAPException. Где его поймают? в ожидании мыла улова или исключении улова? - person User999999; 30.01.2014
comment
Если это пользовательское исключение, вам придется поймать конкретное исключение, которое они выдают, используя созданное ими определение исключения (класс). Это можно найти в используемой ими DLL. Вам нужно будет сослаться на него в своем проекте, чтобы использовать (поймать) его. Но все, что наследуется от исключения базового класса (то, что они должны были бы сделать, если бы создали собственный класс исключения), должно быть перехватываемо с помощью обычного оператора try, catch с использованием Exception e. - person Brian; 30.01.2014
comment
То же самое с пользовательским классом, который наследует SoapException. - person Brian; 30.01.2014
comment
Спасибо за объяснение! - person User999999; 30.01.2014