Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по try ... catch

6.1K
16 марта 2006 года
Flex25
50 / / 14.03.2006
Меня интересует для СТАНДАРТНОЙ библиотеки классов механизм реализовывания обработки исключительных ситуаций.

Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?

Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:

 
Код:
int a=125/0;


Это классическая ошибка деления на 0.

Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?

Заранее спасибо.
351
17 марта 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Flex25
Меня интересует для СТАНДАРТНОЙ библиотеки классов механизм реализовывания обработки исключительных ситуаций.

Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?

Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:

 
Код:
int a=125/0;


Это классическая ошибка деления на 0.

Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?

Заранее спасибо.


Ж))) ну ка дай мне адресочек этого другого форума хочу посмотреть на этих идиотов. :))) Одной из причин создания блоков try{}catch{} явилась идея не перегружать обработкой ошибок основной код а обрабатывать их(ошибки) в отдельном блоке catch. В твоем случае исключение должно выбрасываться ( через throw ) кодом реализуещем деление. Тебе в своем блоке надо только отловить это исключение и в соответвсвии с задачей твоей проги обрабатотать тем или иным образом.

2.4K
17 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Flex25
Меня интересует для СТАНДАРТНОЙ библиотеки классов механизм реализовывания обработки исключительных ситуаций.

Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?

Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:

 
Код:
int a=125/0;


Это классическая ошибка деления на 0.

Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?

Заранее спасибо.



Не веришь и правильно делаешь

 
Код:
try
{
  int a=125/0;
}
catch(...)
{
  // обрабатывай свою ошибку

}

а throw дает тебе возможность самому сгенерировать исключение


 
Код:
int x;
int y;
 


if (y == 0)
{
   throw MyError // можно просто throw без параметров
}
int d = x/y;
6.1K
17 марта 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by dinasok51
Не веришь и правильно делаешь



Вот вы пишете такой код:

 
Код:
try
{
  int a=125/0;
}
catch(...)
{
  // обрабатывай свою ошибку

}


А что конкретно в данном примере поставить заместо многоточия в catch(...)? Совсем без параметров catch() не работает :(
2.4K
17 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Flex25
Вот вы пишете такой код:
 
Код:
try
{
  int a=125/0;
}
catch(...)
{
  // обрабатывай свою ошибку

}


А что конкретно в данном примере поставить заместо многоточия в catch(...)? Совсем без параметров catch() не работает :(



... означает все ошибки будут ловиться в этом catch(...)
Если нужно обрабатывать конкр ошибку, то:

Код:
catch (CFileException* pe)
    {
        pe->GetErrorMessage(ErrorMsg, 255);
        ErrorString = "File can't open. Error is ";
        ErrorString = ErrorString + ErrorMsg;
        AfxMessageBox(ErrorString + "[ThreadDBInitial()]", MB_OK),
        pe->Delete();
    }
    catch (...)
    {
        AfxMessageBox("Error in funktion ThreadDBMInitial()!", MB_OK);
    }
6.1K
17 марта 2006 года
Flex25
50 / / 14.03.2006
Странно, но почемуто ваше многоточие не срабатывает... Пишу такой код:

 
Код:
try {
  int z=0;
  int a=100/z;
} catch(...) {
  cout << "Ура, ошибка перехвачена!";
}


Программа компилируется нормально, а при ее запуске возникает окно ошибки с надписью: "Возникло не перехваченное win32-исключение" (перевод с англ.).

Т.е., как я понимаю, многоточие не помогает почему-то... Я компилирую программу на Visual C++ 2005.

В чем здесь проблема?
2.4K
17 марта 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by Flex25
Странно, но почемуто ваше многоточие не срабатывает... Пишу такой код:

 
Код:
try {
  int z=0;
  int a=100/z;
} catch(...) {
  cout << "Ура, ошибка перехвачена!";
}


Программа компилируется нормально, а при ее запуске возникает окно ошибки с надписью: "Возникло не перехваченное win32-исключение" (перевод с англ.).

Т.е., как я понимаю, многоточие не помогает почему-то... Я компилирую программу на Visual C++ 2005.

В чем здесь проблема?



На VS6 все работает правильно.
На VS2005 и вправду не работает, пока не понял почему. Использую ее только 3 недели

1.8K
17 марта 2006 года
_const_
229 / / 26.11.2003
Цитата:
Originally posted by Flex25
Странно, но почемуто ваше многоточие не срабатывает... Пишу такой код:

 
Код:
try {
  int z=0;
  int a=100/z;
} catch(...) {
  cout << "Ура, ошибка перехвачена!";
}


Программа компилируется нормально, а при ее запуске возникает окно ошибки с надписью: "Возникло не перехваченное win32-исключение" (перевод с англ.).

Т.е., как я понимаю, многоточие не помогает почему-то... Я компилирую программу на Visual C++ 2005.

В чем здесь проблема?


Проблема в том, что блок try/catch перехватывает исключения C++. В случае деления на ноль (и многих других, например, ошибки доступа к памяти) генерируются структурные исключения ОС. Они перехватываются по-другому (см. SEH в MSDN, __try/except). Чтобы использовать стиль C++ для перехвата структурных исключений, установите опцию /EHa компилятора. Также можно воспользоваться ф-цией _set_se_translator, либо прямо так и писАть

 
Код:
__try
{
  z = 0;
  i = 10 / z;
}
except(EXCEPTION_EXECUTE_HANDLER)
{
  std::cout << "Handling exception\n";
}

Последний способ не самый удачный - лучше пользоваться механизмами C++ и ф-цией _set_se_translator.
6.1K
17 марта 2006 года
Flex25
50 / / 14.03.2006
Цитата:
Originally posted by _const_
Проблема в том, что блок try/catch перехватывает исключения C++. В случае деления на ноль (и многих других, например, ошибки доступа к памяти) генерируются структурные исключения ОС. Они перехватываются по-другому (см. SEH в MSDN, __try/except). Чтобы использовать стиль C++ для перехвата структурных исключений, установите опцию /EHa компилятора. Также можно воспользоваться ф-цией _set_se_translator.



Спасибо огромное, _const_! Я бы до этого сам никогда бы не додумался!

Для меня более удобным способом оказалось выставление опции /EHa компилятора.

1.8K
17 марта 2006 года
_const_
229 / / 26.11.2003
Цитата:
Originally posted by Flex25
Спасибо огромное, _const_! Я бы до этого сам никогда бы не додумался!

Для меня более удобным способом оказалось выставление опции /EHa компилятора.



На самом деле лучше пользоваться еще и _set_se_translator. Тогда, создав класс-обертку, легко не просто отлавливать исключения, но и получать хоть какую-то информацию о нем. Пример

Код:
class SE_Exception
{
public:
  SE_Exception(unsigned int code,
       const EXCEPTION_POINTERS *pExp) {...};
};

void trans_func( unsigned int u,
               EXCEPTION_POINTERS* pExp )
{
    throw SE_Exception(u, pExp);
}

_set_se_translator(trans_func);

try
{
  ...
}
catch(SE_Exception& e)
{
// из e получаем SE information
}
catch(...)
{
}

Ну это так, для общего стиля. Сам редко им пользуюсь. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог