небольшая проблема в использовании обработки исключений в C ++ - PullRequest
2 голосов
/ 01 июля 2011

В приведенной ниже программе простого исключения выдается необработанное исключение «Исключение Microsoft C ++: int в области памяти 0x0012fe94 ..»Я получаю эту ошибку сразу после того, как функция Exp () возвращается.Пожалуйста, кто-нибудь может сказать, почему эта ошибка появляется здесь.Также будет полезно, если все возможные ошибки в этом коде были объяснены / проанализированы.Я учусь кодировать лучше.

Я использую Visual C ++ 2005.

#include <iostream>
using namespace std;

int main ()
{
   int excep(int);

   throw excep(20);

   return 0;
}

int excep(int e)
{

    cout << "An exception occurred. Exception Nr. " << e << endl;
    return 0;

}

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Что вы ожидали, что произойдет?

Вы вызываете функцию, которая печатает «Возникла исключительная ситуация», плюс другой текст, а затем выдает результирующее значение как исключение, которое вы никогда не перехватываете,поэтому программа сообщает, что было выброшено необъяснимое исключение.Это правда, потому что это именно то, что вы только что сделали.

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

Если вы хотите обработать исключение, вам нужно обернуть бросающий код в блок try, за которым следует catch, какв:

try {
    throw excep(20);
}
catch (int ex) {
   // do something about the exception
}
3 голосов
/ 01 июля 2011

Если вы попытаетесь узнать, что исключение / обработка кода содержит ошибку.Функция Exec должна обрабатывать объект, который был брошен, чтобы не быть брошенным сам по себе.Ваш код должен быть переписан следующим образом:

using namespace std;
int excep(int e) 
{ 
       cout << "An exception occurred. Exception Nr. " << e << endl; 
       return 0;
}
int main () 
{ 
     int excep(int);
     try
     { // <--------- Begin of try block. required part of the exception handling
         throw 20;
     }
     catch (const int &errCode) // <------- we are catching only ints
     {
             excep(errCode); // Function that handles exception
     }

     return 0; 
}  

Это хороший дизайн - не бросать переменные типа int, а тип, который наследует std :: exception.Но это более сложное исключение, использующее знания

1 голос
/ 01 июля 2011

В строке

throw excep(20);

excep(20) вызывается первым, чье возвращаемое значение затем выбрасывается, то есть вы бросаете целое число. Это примерно эквивалентно:

const int i = excep(20);
throw i;

Чтобы вы поняли, как выглядит исключение-snytax:

#include <iostream>
#include <stdexcept>
using namespace std;

int main ()
{
   try {
       // do something
       throw std::runtime_error("test");
   } catch (const std::exception &e) {
       std::cout << "exception: " << e.what() << std::endl;
   }
}

В практическом смысле: НИКОГДА не выбрасывайте ничего, что не является производным от std::exception.

Предлагаемые чтения:

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