Редактировать:
Для тех, кто заинтересован в более чистом способе реализации этого, взгляните на этот ответ < / а>.
В моей работе мне часто приходится использовать сторонний API для доступа к удаленной системе. Например, чтобы создать запрос и отправить его в удаленную систему:
#include "external_lib.h"
void SendRequest(UserRequest user_request)
{
try
{
external_lib::Request my_request;
my_request.SetPrice(user_request.price);
my_request.SetVolume(user_request.quantity);
my_request.SetVisibleVolume(user_request.quantity);
my_request.SetReference(user_request.instrument);
my_request.SetUserID(user_request.user_name);
my_request.SetUserPassword(user_request.user_name);
// Meny other member affectations ...
}
catch(external_lib::out_of_range_error& e)
{
// Price , volume ????
}
catch(external_lib::error_t& e)
{
// Here I need to tell the user what was going wrong
}
}
Установщик каждой библиотеки проверяет значения, предоставленные конечным пользователем, и может выдавать исключение, когда пользователь не соответствует потребностям удаленной системы. Например, конкретному пользователю может быть запрещено отправлять слишком большой объем. Это пример, и на самом деле много раз пользователи пытаются не соблюдать: нет давно действующего инструмента, цены превышают лимит и т. Д. И т. Д. Следовательно, нашему конечному пользователю нужна явная ошибка сообщение, чтобы сообщить ему, что изменить в его запросе, чтобы получить второй шанс составить действительный запрос. Я должен дать ему такие подсказки
Как бы то ни было, исключения внешней библиотеки (в основном) никогда не указывают, какое поле является источником прерывания запроса.
Как вы считаете, как лучше всего справляться с этими исключениями?
Моя первая попытка обработать эти исключения состояла в том, чтобы «обернуть» класс Request моим. Затем каждый сеттер упаковывается в метод, который выполняет только одно: блок try / catch. Затем блок catch генерирует новые мои исключения: my_out_of_range_volume или my_out_of_range_price в зависимости от установщика. Например, SetVolume () будет обернут следующим образом:
My_Request::SetVolume(const int volume)
{
try
{
m_Request.SetVolume(volume);
}
catch(external_lib::out_range_error& e)
{
throw my_out_of_range_volume(volume, e);
}
}
Что ты думаешь об этом? Что вы думаете о накладных расходах на обработку исключений, которые это подразумевает? ...: /
Что ж, вопрос открыт, мне нужна новая идея, чтобы избавиться от ограничений библиотеки!