Попробуй поймай - не ловишь - PullRequest
2 голосов
/ 05 января 2010

Вот моя проблема. У меня есть промежуточный веб-сервис, используемый несколькими веб-клиентами. Веб-сервис - это сервис-оболочка, который выполняет звонки на веб-сервисы нескольких поставщиков. Вызов веб-службы поставщика заключен в TryCatch, но все сгенерированные исключения не попадают в мой веб-сервис, а попадают в клиентские приложения.

Я что-то упустил? Это связано с этой публикацией ?

Вот упрощенный фрагмент кода:

    Dim VendorWebservice as New VendorWebservice
    Dim VendorResponse As VendorResponse = Nothing
    Dim ClientResponse as New CustomClientResponse
    Try
        VendorResponse = VendorWebservice.VendorWebMethod
    Catch ex As Exception
        ClientResponse.ErrorMessage = ex.Message
        ClientResponse.Status = "VendorError"
        Return ClientResponse
    End Try

EDIT

Чтобы раскрыть некоторые детали ... Код выполняется успешно в 99 +% случаев. В редких случаях возникает проблема с веб-сайтом поставщика, когда возникает эта проблема. Я открыл VS как для одного из веб-клиентов, так и для веб-службы, и могу пройти по коду от клиента до WS и обратно. Когда я смог воспроизвести проблему, я прошел через клиентский код туда, где он вызывает наш веб-сервис, затем переключился на код WS и проходил до тех пор, пока он не вызывает код поставщика, и в этот момент он возвращается к клиентскому коду, без нажатия на блок Catch или любой код после него.

Надеюсь, это поможет.

EDIT

Некоторые из опубликованных ответов предоставили возможности для исследований, особенно примечательно, что могут быть созданы исключения, которые не являются производными от System.Exception. (Кто знал?) Но я также узнал, что в .NET 2.0 и более поздних версиях эти не-System.Exception исключения заключаются в .NET в System.Exception. Так что в теории это должно исключать не System.Exceptions out.

Кроме того, из моего прочтения теоретически при вызове веб-службы (как это делает мой веб-сервис) должны быть только два типа исключений: System.Net.WebException и System.Web.Services.Protocols.SoapException, оба из которых происходят от System.Exception. Я не знаю, действительно ли это правда, если при вызове веб-службы возможны только 2 типа исключений, но я добавлю это. :)

Все еще в поисках ответа ...

EDIT

Воспроизведение условия ошибки оказалось неуловимым. Каждый сценарий, который я бросил в коде, отвечал как ожидалось, с ошибкой, улавливаемой в блоке Catch. Хотя теоретически .NET должен обернуть исключения, которые не являются производными от System.Exception, единственный логичный ответ, по-видимому, согласуется с ответом Джо о том, что возникшее нами исключение НЕ происходит из System.Exception и, таким образом, рассматривается как необработанное. исключение.

Ответы [ 6 ]

2 голосов
/ 05 января 2010

Получаются ли исключения из Исключения? («Исключение» определенно относится к «System.Exception»)

1 голос
/ 22 декабря 2018

Я знаю, что это очень старый вопрос, но я столкнулся с этой ситуацией, и ничего, что я нашел в Интернете, не помогло. После этого я наконец наткнулся на ответ, хотя и не могу объяснить, почему. Вот в двух словах:

Это уменьшенная версия моего исходного кода, который не работал:

Try
   File.Copy(FromFile,ToFile,True)
Catch ex As ApplicationException
   [Error handled here]
End Try

Копия файла может привести к ошибке при использовании файла, поэтому было важно, чтобы я мог ее перехватить, но вышеприведенное просто выдаст ошибку, как описано в приведенном выше обсуждении.

Мне удалось исправить проблему, изменив код на:

Try
   File.Copy(FromFile,ToFile,True)
Catch
   [Error handled here]
End Try

Удаление «... ex As ApplicationException» решило проблему, и теперь ошибки в операции копирования файла перехватываются. Мне не нравится, что я не могу исследовать фактическую ошибку, но в этом случае я вполне могу предположить, что это за ошибка.

Опять же, извините, что я не знаю , почему это работает; Я могу попытаться выяснить это в какой-то момент, но, по крайней мере, я могу уйти от этой проблемы.

1 голос
/ 14 ноября 2010

Я видел эту же ошибку раньше в каком-то коде из предыдущей работы. В нашем случае создаваемая ошибка НЕ ​​произошла из System.Exception. Как только мы узнали это, с ним было довольно легко справиться.

1 голос
/ 05 января 2010

Вы уверены, что исключение происходит внутри try / catch?

попробуйте переместить "как новый" внутрь try / catch тоже

0 голосов
/ 05 января 2010

Мне лично трудно поверить, что в этом коде происходит ошибка, и она не попадает в ловушку try. Может быть, положить наконец и посмотреть, если это выполняется.

Во-первых, вам нужен достойный способ воссоздать вашу ошибку.

Следующее, что я хотел бы сделать, это попытаться выяснить, где именно в коде выдается ошибка. Что бы я сделал, так это временно поместил бы в каждой записи кода операторы logging (возможно, Debug.Output), чтобы вы могли быть уверены, какие строки действительно выполнялись.

Когда произойдет ваша ошибка, вы сможете просмотреть выходные данные этих журналов, чтобы увидеть, по крайней мере, где происходит ошибка. Теперь, когда вы это знаете, это может дать вам лучшее представление о том, что происходит. Если появятся все операторы регистрации, вы будете знать, что ошибка не возникает в этом блоке кода. Мое первоначальное предположение - вот что происходит.

Поскольку ничего не попадает в ловушку, вам нужно устранить все остальное, что может происходить. Если возможно, поместите этот кусочек кода в крошечное приложение для тестирования, чтобы убедиться, что оно работает правильно.

Надеюсь, это поможет.

0 голосов
/ 05 января 2010

Обычно веб-службы не генерируют исключения, а вместо этого возвращают какой-либо объект ошибки, сообщение об ошибке или статус. Если вы ставите точку останова после вызова VendorResponse, вы можете проверить, что было возвращено, и посмотреть, есть ли какие-либо свойства «error» или «status». Если это так, вы можете проверить их содержимое в своем коде, а затем вызвать исключение или иным образом обработать ситуацию.

...