Исключение не поймано при вызове RESTSharp

Я использую RestSharp для связи с REST-сервером и написал небольшую функцию-оболочку для вызова

private T Get<T>(string restAdress) where T : new()
{
    try
    {
        // throw new Exception(); // This one is caught
        IRestClient restClient = new RestClient(settings.Value.HostToConnect).UseSerializer(new JsonNetSerializer()); // (1)
        RestRequest restRequest = new RestRequest(restAdress);
        IRestResponse<T> result = restClient.Get<T>(restRequest); // (2)
        return result.Data;
    }
    catch (Exception e) // debugger wont stop here
    {
        // debugger wont stop here too
        // code within this block is not executed
    }

    return null; // (3)
}

Поскольку я хочу использовать Newtonsoft-Attributes, я даю пользовательский (де) сериализатор (1).

    public class JsonNetSerializer : IRestSerializer
    {
        public string Serialize(object obj) =>
            JsonConvert.SerializeObject(obj);

        public string Serialize(RestSharp.Parameter bodyParameter) =>
            JsonConvert.SerializeObject(bodyParameter.Value);

        public T Deserialize<T>(IRestResponse response) =>
            JsonConvert.DeserializeObject<T>(response.Content); // (4)

        public string[] SupportedContentTypes { get; } =
        {
            "application/json", "text/json", "text/x-json", "text/javascript", "*+json"
        };

        public string ContentType { get; set; } = "application/json";

        public DataFormat DataFormat { get; } = DataFormat.Json;
    }

При вызове службы REST и попытке получить результат (2) выдается Exception, если десериализация не удалась (4). Но Exception не попадает в блок try-catch. Я пытался отладить, но после броска отладчика продолжается в строке (3), catch и регистрация с уловом никогда не выполняется. Отладчик даже не остановится на catch (Exception e), он сразу переходит от (4) к (3).

Исключение не поймано при вызове RESTSharp (Извините за не английский, в заголовке окна написано "Exception User-Unhandled")

Кто-нибудь может объяснить мне такое поведение?

Вы очистили свой проект и перестроили его (перестроить все — это не то же самое, что полная очистка)? Обычно это происходит, когда есть некоторое несоответствие между выполняемыми сборками и тем, что пытается сопоставить отладчик.

grek40 12.07.2019 11:27

@grek40 Я делал это несколько раз

Narase 12.07.2019 11:42
Стоит ли изучать 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
2
866
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я поддерживаю RestSharp, поэтому надеюсь, что смогу ответить на этот вопрос.

RestSharp по умолчанию не запускает десериализацию. Если вы посмотрите на код, десериализация происходит в приватном IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse raw) методе RestClient.

Когда RestSharp не может десериализовать ответ, он создает ответ об ошибке. Вы получаете статус ответа, установленный на Error, и исключение помещается в свойство ErrorException объекта ответа вместе с сообщением об исключении, которое попадает в ErrorMessage ответа.

Все еще можно указать RestSharp запустить десериализацию, если вы назначите свойство FailOnDeserialization экземпляра RestClient на true.

Спасибо за ваше время. Я попытался установить для FailOnDeserialization значение true и выдал исключение в JsonNetSerializer.Deserialize<T>(...), но RestSharp по-прежнему перехватывает исключение, и мой улов был бесполезен, как и раньше. Учитывая исходный код, я также не вижу повторного броска

Narase 12.07.2019 12:26

Это странно. Вы не против открыть задачу в репозитории RestSharp?

Alexey Zimarev 12.07.2019 12:33

Сделанный. Спасибо, хотя другой ответ был технически правильным

Narase 12.07.2019 12:45
Ответ принят как подходящий

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

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

В вашем случае вы найдете эту опцию в разделе «Ausnahmeeinstellungen».

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