Donguy1976 Ответов: 1

Обработка исключений в C++ DLL


Это скорее дизайнерское предложение, которое я хочу услышать от экспертов по C++ здесь.

У меня есть библиотека DLL C++ в среде IDE VS 2015. Я хочу добавить больше обработки исключений в этот код.

В настоящее время существует следующая функция.
void Metrics::GetNumbers(InputParams* input, OutputParams* output)
{
    int i, x, k;
    int status = 0;
    char* mesg;
    ............;
    ............;

    try{
         const char* name = input->getName(&status, &mesg); //this returns a name string 
         and status will contain whether success or failure and mesg will have any error 
         messages.

         const char* age = input->getAge(&status, &mesg);

         ..............................................;
         ..............................................;

         vector <int> myVectorNumers = input->getNumberArray(&status, &mesg);

         vector <int> myVectorInfos = input->getInfoArray(&status, &mesg);

        ...............................................................;
       }
     catch (std::exception e&)
     {
         // TODO
     }
     catch (...)
     {
         // TODO
     }


Приведенный выше код находится в DLL. И вход это указатель, указывающий на клиент, вызывающий эту библиотеку DLL. Таким образом, DLL запрашивает у клиента определенную информацию, как указано выше.

Он дает информацию в качестве возврата к этим вызовам, а также статус, и mesg также будет содержать информацию о том, были ли эти вызовы успешными.

Ни одна из клиентских функций (getName, getAge,...) не возвращает исключение, и мне нужно справиться с этим самому.

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

Что я уже пробовал:

Что-то вроде этого,
const char* age = input->getAge(&status, &mesg);
std::exception ex;

if (age == NULL || status == ERROR)
{
      throw ex;
}
Я должен добавить, если условие после каждого вход вызов. Вместо этого в идеале это должна быть другая функция, которая проверит, является ли указатель нулевым, а статус-ошибкой, а затем вернет исключение.

Так что в основном я имею в виду более совершенный код, а не дублирование одних и тех же строк несколькими строками внутри одной и той же функции.

В идеальном сценарии код должен быть таким,

const char* name = input->getName(&status, &mesg);
CheckException(name, status);  //this function should return an exception if either name or status fails.

const char* age = input->getAge(&status, &mesg);
CheckException(age, status); //this function should return an exception if either age or status fails.
Я не знаю, как спроектировать что-то подобное. Я был бы признателен, если бы кто-нибудь подал мне несколько идей.

1 Ответов

Рейтинг:
1

Richard MacCutchan

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


Donguy1976

Клиенту здесь ничего не нужно делать. Исключение должно быть обработано только в коде DLL. Условие IF, которое я написал выше, заключается просто в том, чтобы поймать исключение в DLL и обработать его, то есть записать информацию об исключении в файл журнала или что-то в этом роде.

Но я все еще не понимаю, как переместить этот блок условий IF в отдельную функцию, чтобы его не нужно было дублировать несколько раз в функции GetNumbers.

Richard MacCutchan

Как я уже сказал, перестройте исключение в DLL, и клиенту не нужно ничего делать.

Donguy1976

Не могли бы вы предоставить пример кода для повторного создания исключения?

Richard MacCutchan

Просто бросьте объект, который передается в блок catch.

Вы также можете пойти и прочитать документацию по обработке исключений.