Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2012, 18:17   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание Генерирование исключений, список throw()

Как бы если мы делаем так:
Код:
std :: string func2(std :: string x) throw(std :: string)
то это значит, что мы разрешаем этой функции генерировать только std :: string исключения. Но почему данный код компилируется и работает?!
Код:
std :: string func2(std :: string x) throw(std :: string)
{
   if ( x.length() < 10 ) throw 0;
   else throw 1;
}
_-Re@l-_ вне форума Ответить с цитированием
Старый 07.02.2012, 20:03   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Но почему данный код компилируется и работает?!
Компилируется потому что во время компиляции не известно какие исключения генерирует ваша функция на самом деле.

Что вы подразумеваете под словом "работает" я не знаю, но если функция генерирует исключение, которого нет в спецификации исключений, вызывается unexpected(), которая по-умолчанию вызывает terminate()
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 07.02.2012, 20:40   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Что вы подразумеваете под словом "работает" я не знаю, но если функция генерирует исключение, которого нет в спецификации исключений, вызывается unexpected(), которая по-умолчанию вызывает terminate()
Нет, неправда.. У меня стоит такой код
Код:
try
{
    t = func2(s);
}
catch(std :: string)
{ 
    std :: cout << "std :: string";
}
catch(...)
{
    std :: cout << "unknown";
}
И вот вылазит, как раз, unknown...
_-Re@l-_ вне форума Ответить с цитированием
Старый 08.02.2012, 00:06   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Нет, неправда..
Где не правда? Стандарт в руки и вперед.

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
У меня стоит такой код
конструкция catch(...), в вашем случаи, перехватывает любые исключения, кроме std::string. Т.к. unexpected() попадает в категорию "любые" - оно ловится
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 08.02.2012, 10:12   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вы меня не поняли, Blade.
Я имею ввиду, почему в функции мы можем вбрасывать те исключения, которые мы не указали в списке throw().
_-Re@l-_ вне форума Ответить с цитированием
Старый 08.02.2012, 13:39   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А какой компилятор? MSVS игнорирует спецификацию исключений.
netrino вне форума Ответить с цитированием
Старый 08.02.2012, 16:02   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Я имею ввиду, почему в функции мы можем вбрасывать те исключения, которые мы не указали в списке throw().
Еще раз. Компилятор ничего не знает о том, какие исключения мы генерируем в функции, поэтому на этапе компиляции все проходит нормально. В рантайме же, если функция пытается генерировать исключение, которого нет в спецификации, вызывается unexpected().
Так положено по стандарту. Как это реализовано в различных компиляторах я не знаю, ибо не пользуюсь спецификациями исключений. Вообще этот механизм весьма своеобразный, и им особо не пользуются. Разве что указанием пустого списка throw(), для функций, которые гарантированно не должны генерировать исключений (например для методов std::exception)
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Try, throw, catch; нужно ли знать ООП PHP для изучения исключений? alex455 PHP 1 01.08.2011 13:46
throw, try, catch (С++) mego4el Помощь студентам 2 31.05.2011 18:39
throw Syltan Общие вопросы по Java, Java SE, Kotlin 3 17.06.2010 20:35
не подскажете, где посмотреть список исключений Win32? Tapapax Общие вопросы .NET 3 11.11.2009 12:19
throw() после обьявления функции AxenicX Общие вопросы C/C++ 1 21.10.2009 23:32