C++-исключения vs SEH-исключения [re: Что можно.. ]
Шол бы ты MSDN читать, прежде чем людей в заблуждение вводить.Попробуй просто написать программу, кинуть исключение throw и перехватить __except. Потом пиши сюда. Одно дело читать, другое — писать
Примерно так:
void f
{
__try
{
throw 777;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
cout << "DeemOn sucks" << endl;
}
}
int main
{
try
{
f;
} catch (...)
{
cout << " sucks" << endl;
}
return 0;
}
В функцию вынес, потому что в пределах одной функции перемешивать нельзя.
try/catch - C++ exception. __try/__catch - SEH. Они разные и плохо совместимые.Понимаю, ты только проснулся, тебе это пригрезилось =)
Без специальных телодвижений обычный catch SEH-исключения не ловит.Это утверждение ортогонально тому, что в винде try/catch реализован через SEH, это следствие различия интерфейсов. Причем это не фундаментальное ограничение, ты сам пишешь, что оно обходится. Как? Можно почитать Рихтера, например.
upd: И если я сейчас правильно вспомню, то чтобы отловить SEH catch'ем, надо просто включить в компиляторе ключ. «Специальные телодвижения» нужны чтобы отличать SEH-исключениях от C++-ных.
Попробуй просто написать программу, кинуть исключение throw и перехватить __except. Потом пиши сюда. Одно дело читать, другое — писать
ОК, беру твою прогу и выношу throw в другую функцию.
void t
{
throw 666;
}
void f
{
__try
{
t;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
cout << "DeemOn sucks" << endl;
}
}
Выводит " sucks".
сам пишешь, что оно обходится. Как? Можно почитать Рихтера, например.
А можно MSDN. (_set_se_translator )
Сказать-то что хочешь? Я вообще выношу cout << " sucks a buck of dicks" << endl; в функцию main. Твои действия?
Сказать-то что хочешь?Что твои слова пока необоснованны. Один загадочный пример не годится, нужны ссылки на описание того, как действительно реализовано.
Тем более, что ты лукавишь
Нет, просто запускал в VC6. Настроек компилятора не трогал.
Сказать-то что хочешь?механизмы разные, а компилятор C++ иногда догадывается, что надо вставить код, который преобразует одно в другое.
Один загадочный пример не годитсяСлушай, . Вот ты не знаешь как это работает, пишешь как раз ничем не обоснованные утверждения, удосужившись заглянуть только в приветственную страничку MSDN'а про исключения. Уже того, что я показал тебе программу достаточно. Учитесь искать информацию.
Еще ты врешь.
Предлагаю всем желающим убедиться, запустив программу
#include <tchar.h>
#include <iostream>
#include <excpt.h>
#include <windows.h>
using namespace std;
void t
{
throw 777;
}
void f
{
__try
{
t;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
cout << " sucks" << endl;
}
}
int main
{
try
{
f;
} catch (...)
{
cout << " sucks" << endl;
}
return 0;
}
Можно отвечать кратко: единственная строчка, которая появляется на экране.
Компилировать студией. Не юлить =) Я тоже могу не изменяя этих строчек заставить выводиться все что угодно.
механизмы разные, а компилятор C++ иногда догадывается, что надо вставить код, который преобразует одно в другое.try/catch компилятор Visual C++ реализует через SEH. Точка. Сам же Рихтера советуешь
Вот от тебя не ожидал.
Извини, ошибся. Забыл про другое изменение исходника. Действительно, выводит то же, что у тебя.
try/catch компилятор Visual C++ реализует через SEH. Точка.с этим не спорю.
Извини, ошибся. Забыл про другое изменение исходника. Действительно, выводит то же, что у тебя.Что выводит напиши
что сделает _tmain расскоментированный, и что сделает _tmain закоментированный?
и почему поведение разное, если ты говоришь, что механизм один и тот же?
#include <iostream>
#include <windows.h>
int z = 5;
void f
{
int x = 4/z;
}
int _tmain(int argc, _TCHAR* argv[])
{
try
{
z = 0;
f;
std::cout << "ok" << std::endl;
}
catch (...)
{
std::cout << "catch" << std::endl;
}
return 0;
}
//int _tmain(int argc, _TCHAR* argv[])
//{
// __try
// {
// z = 0;
// f;
// std::cout << "ok" << std::endl;
// }
// __except (EXCEPTION_EXECUTE_HANDLER)
// {
// std::cout << "catch" << std::endl;
//
// }
//
// return 0;
//}
Точнее: можно так задать ключ, что оба будут работать одинаково.
Еще точнее: ключ /EHa позволяет catch(...) перехватывать исключения, брошенные RaiseException etc.
upd: так и вышло.
Предполагаю, что зависит от ключа компилятору.ты б еще ответил, что "зависит от положения пятен на солнце".
сказал А, говори и B - какие ключи и в чем будет разница.
зы
до этого ты утверждал, что механизм один и тот же - и не про какие ключи речь не шла.
сказал А, говори и B - какие ключи и в чем будет разница.Прочитай апдейт, устраивает?
до этого ты утверждал, что механизм один и тот же - и не про какие ключи речь не шла.Неправда, пруфлинк
Я утверждал, что try/catch реализован через SEH, откуда следует, что throw-исключения можно отловить __except. И _сразу же_ сказал, что чтобы было наоборот нужны телодвижения. Потом подправил (время там указано что достаточно ключа компилятора, если программист не искушен.
И _сразу же_ сказал, что чтобы было наоборот нужны телодвижения.ну, да, если тред прочитать заново, то непонятно о чем спор идет.
это я намекаю на то, что твои посты почти везде дополненные по сравнению с тем, на что шли замечания.
зы
если по существу, то да:
C++-исключения сделаны поверх SEH
C++ catch не ловит голые SEH-исключения без спец. телодвижений.
спец. телодвижения, в виде, включения опции /Eha просаживают производительность C++-приложения где-то в 2 раза и при этом не помогает правильной размотке C++-стека, и часть деструкторов все равно не вызывается
зы
2 раза было на vc6, сейчас может лучше
часть деструкторов все равно не вызываетсяПро это читал где-то, но у себя проверить не удалось.
А есть пример кода, который компилируется, но деструктор не вызывается? Вообще говоря момент принципиальный, сыконтно как-то =)
если по существу, то да:Еще можно доснобствовать и сказать, что в release-версии при делении на ноль не будет брошено HW-исключение и будет выведено «ok» =)
C++-исключения сделаны поверх SEH
C++ catch не ловит голые SEH-исключения без спец. телодвижений.
спец. телодвижения, в виде, включения опции /Eha
это я намекаю на то, что твои посты почти везде дополненные по сравнению с тем, на что шли замечания.Ну это да, надо привыкнуть отвечать, а не править, но все правки в этом треде я делал до того как последуют ответы на соответствующие посты. Просто тут в некоторый момент все начали усердно постить и правда можно было запутаться.
А есть пример кода, который компилируется, но деструктор не вызывается? Вообще говоря момент принципиальный, сыконтно как-то =)это я наврал все-таки
опять же с vc6 опыт тянется.
в vc8 у меня не получилось потерять, но производительность-да, сажается сильно при включенном /EHa, т.к. в каждую функцию где используются классы с деструктором вставляется код, который навешивает SEH-обработчик
Еще можно доснобствовать и сказать, что в release-версии при делении на ноль не будет брошено HW-исключение и будет выведено «ok» =)если речь про мой пример, то - да
но это потому что x не используется и оптимизатор просто выкидывает само деление.
если речь про мой пример, то - дада, ты прав, действительно думать надо =)
но это потому что x не используется и оптимизатор просто выкидывает само деление.
Оставить комментарий
karkar
Шол бы ты MSDN читать, прежде чем людей в заблуждение вводить.
try/catch - C++ exception. __try/__catch - SEH. Они разные и плохо совместимые. Без специальных телодвижений обычный catch SEH-исключения не ловит.