Бросить в C ++ триггеры сообщение программы, а затем сбой - PullRequest
0 голосов
/ 21 июня 2011

Я отладил свое приложение, и код мгновенно падает после оператора throw внутри этого кода:

try
{
    char newbuff[8];
    if(strlen(cstr) > sizeof(newbuff))
    {
         throw BUFFER_TOO_SMALL;
    }
    if(strlen(cstr) == 0)
    {
         throw NO_CONTENT;
    }
    strcpy(newbuff, cstr); //Yeah yeah yeah, I know, I'm just learning
    ptr = newbuff;
}
catch(int errn)
{
     cout << "error: ";
     if(errn == BUFFER_TOO_SMALL)
     {
          cout << "storage buffer too small.\n";
          return 0;
     }
     if(errn == NO_CONTENT)
     {
          cout << "no content inside of buffer.\n";
          return 0;
     }
}

Итак, при отладке происходит сбой прямо на инструкции throw. Интересно, что CLI (в данном случае, 'cmd.exe') показывает это сообщение (которое я туда поместил , а не , и оно либо из компилятора, либо из ОС):

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

Сейчас я больше склоняюсь к C ++, поскольку раньше я просто программировал на C. Как вы можете сказать, сейчас я пытаюсь управлять системой обработки исключений try-catch, которую использует C ++.

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

Похоже, что в newbuff нет места для терминатора NULL. Вы должны изменить размер newbuff [8] на newbuff [9].

0 голосов
/ 21 июня 2011

Ваш оператор if выглядит неправильно: имя newbuff указывает на указатель, и его размер будет равен 4 в 32-разрядной системе или 8 в 64-разрядной системе. О, правильно, после того, как я написал, что вы отредактировали ваш код, чтобы показать определение newbuff в виде массива. Но все равно.

throw может аварийно завершить работу, если нет обработчика. В этом случае стандарт не требует перемотки стека (уничтожение локальных объектов).

Кажется, что BUFFER_TOO_SMALL - это константа, вероятно, целое число. Вы не должны бросать целые числа (если вы действительно не знаете, что делаете). Бросай std::exception объектов, например std::runtime_error.

Редактировать: Ваш обновленный код показывает, что вы ловите int. Это означает, что ваши заглавные константы не int. Но совет остается в любом случае.

Существует также проблема стиля, использование ALL UPPERCASE для константы. Не. Это Java-изм: в C и C ++ по соглашению все прописные буквы предназначены только для макросов и макросов.

Приветствия & hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...