Я использую 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).
(Извините за не английский, в заголовке окна написано "Exception User-Unhandled")
Кто-нибудь может объяснить мне такое поведение?
@grek40 Я делал это несколько раз





Я поддерживаю 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 по-прежнему перехватывает исключение, и мой улов был бесполезен, как и раньше. Учитывая исходный код, я также не вижу повторного броска
Это странно. Вы не против открыть задачу в репозитории RestSharp?
Сделанный. Спасибо, хотя другой ответ был технически правильным
Здесь происходит интересная настройка отладчика, другим примером может быть закрытый отчет об ошибке. Когда отладчик достигает момента, когда выдается исключение, он сломается, что приведет к поведению, которое вы испытали.
Если вы снимите отметку с параметра исключения «Прервать, когда этот тип исключения не обрабатывается пользователем» в диалоговом окне, вы сможете получить доступ к своему блоку catch, поскольку отладчик больше не прерывает выполнение, как только выдается указанное исключение.
В вашем случае вы найдете эту опцию в разделе «Ausnahmeeinstellungen».
Вы очистили свой проект и перестроили его (перестроить все — это не то же самое, что полная очистка)? Обычно это происходит, когда есть некоторое несоответствие между выполняемыми сборками и тем, что пытается сопоставить отладчик.