Исключение не ловится, когда выбрасывается RESTSharp - PullRequest
1 голос
/ 10 июля 2019

Я использую 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, я даю специальный (de) сериализатор (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).

enter image description here (Извините за не английский, заголовок окна гласит «Исключение - пользователь не обработан»)

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

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

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

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

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

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

1 голос
/ 12 июля 2019

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

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

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

...