Вопрос по try ... catch
Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?
Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:
Это классическая ошибка деления на 0.
Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?
Заранее спасибо.
Меня интересует для СТАНДАРТНОЙ библиотеки классов механизм реализовывания обработки исключительных ситуаций.
Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?
Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:
Это классическая ошибка деления на 0.
Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?
Заранее спасибо.
Ж))) ну ка дай мне адресочек этого другого форума хочу посмотреть на этих идиотов. :))) Одной из причин создания блоков try{}catch{} явилась идея не перегружать обработкой ошибок основной код а обрабатывать их(ошибки) в отдельном блоке catch. В твоем случае исключение должно выбрасываться ( через throw ) кодом реализуещем деление. Тебе в своем блоке надо только отловить это исключение и в соответвсвии с задачей твоей проги обрабатотать тем или иным образом.
Меня интересует для СТАНДАРТНОЙ библиотеки классов механизм реализовывания обработки исключительных ситуаций.
Из книг и др. форумов я узнал, что исключительные ситуации могут в C++ генерироваться ТОЛЬКО функцией throw. А как обработать исключительные ситуации БЕЗ ф-ии throw?
Имеется ввиду, например, как обработать ошибку БЕЗ использования throw вот в таком примере:
Это классическая ошибка деления на 0.
Почему я не хочу использовать throw - потому что в реальной жизни момент и причина возникновения ошибки не всегда может быть проконтроллтирована. Для обработки этих ошибок во времени исполнения обычно и используются try...catch. А для чего же тогда нужен этот try в C++, если без throw Он не работает (так мне сказали на др. форуме)?
Заранее спасибо.
Не веришь и правильно делаешь
{
int a=125/0;
}
catch(...)
{
// обрабатывай свою ошибку
}
а throw дает тебе возможность самому сгенерировать исключение
int y;
if (y == 0)
{
throw MyError // можно просто throw без параметров
}
int d = x/y;
Не веришь и правильно делаешь
Вот вы пишете такой код:
{
int a=125/0;
}
catch(...)
{
// обрабатывай свою ошибку
}
А что конкретно в данном примере поставить заместо многоточия в catch(...)? Совсем без параметров catch() не работает :(
Вот вы пишете такой код:
{
int a=125/0;
}
catch(...)
{
// обрабатывай свою ошибку
}
А что конкретно в данном примере поставить заместо многоточия в catch(...)? Совсем без параметров catch() не работает :(
... означает все ошибки будут ловиться в этом catch(...)
Если нужно обрабатывать конкр ошибку, то:
{
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);
}
int z=0;
int a=100/z;
} catch(...) {
cout << "Ура, ошибка перехвачена!";
}
Программа компилируется нормально, а при ее запуске возникает окно ошибки с надписью: "Возникло не перехваченное win32-исключение" (перевод с англ.).
Т.е., как я понимаю, многоточие не помогает почему-то... Я компилирую программу на Visual C++ 2005.
В чем здесь проблема?
Странно, но почемуто ваше многоточие не срабатывает... Пишу такой код:
int z=0;
int a=100/z;
} catch(...) {
cout << "Ура, ошибка перехвачена!";
}
Программа компилируется нормально, а при ее запуске возникает окно ошибки с надписью: "Возникло не перехваченное win32-исключение" (перевод с англ.).
Т.е., как я понимаю, многоточие не помогает почему-то... Я компилирую программу на Visual C++ 2005.
В чем здесь проблема?
На VS6 все работает правильно.
На VS2005 и вправду не работает, пока не понял почему. Использую ее только 3 недели
Странно, но почемуто ваше многоточие не срабатывает... Пишу такой код:
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, либо прямо так и писАть
{
z = 0;
i = 10 / z;
}
except(EXCEPTION_EXECUTE_HANDLER)
{
std::cout << "Handling exception\n";
}
Последний способ не самый удачный - лучше пользоваться механизмами C++ и ф-цией _set_se_translator.
Проблема в том, что блок try/catch перехватывает исключения C++. В случае деления на ноль (и многих других, например, ошибки доступа к памяти) генерируются структурные исключения ОС. Они перехватываются по-другому (см. SEH в MSDN, __try/except). Чтобы использовать стиль C++ для перехвата структурных исключений, установите опцию /EHa компилятора. Также можно воспользоваться ф-цией _set_se_translator.
Спасибо огромное, _const_! Я бы до этого сам никогда бы не додумался!
Для меня более удобным способом оказалось выставление опции /EHa компилятора.
Спасибо огромное, _const_! Я бы до этого сам никогда бы не додумался!
Для меня более удобным способом оказалось выставление опции /EHa компилятора.
На самом деле лучше пользоваться еще и _set_se_translator. Тогда, создав класс-обертку, легко не просто отлавливать исключения, но и получать хоть какую-то информацию о нем. Пример
{
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(...)
{
}
Ну это так, для общего стиля. Сам редко им пользуюсь. :)