Форум программистов, компьютерный форум CyberForum.ru

если ли стандартное исключение чтоб перехватывало - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 02:47     если ли стандартное исключение чтоб перехватывало #1
что б перехватывало
а ля

C++
1
2
3
4
5
6
7
8
9
unsigned int a = - 2 ; 
 
try 
{
cout << a ; 
}
 
catch (??? ) 
{}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 02:47     если ли стандартное исключение чтоб перехватывало
Посмотрите здесь:

C++ Стандартное определение длины строки в С++
C++ DEV++ стандартное окно
Вот часть кода, в нем я должен сделать если я ничего не ввожу то чтоб вывело сообщение о том что пользователь не ввел данных, но у меня не выходит C++
C++ как сделать так, чтоб если вводишь не цифры, а буквы он не выкидывал из программы, а выполнял команду
без знаковый double. Если ли чтоб можно было в шаблон пихать или самому сделать придется ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.09.2012, 03:14     если ли стандартное исключение чтоб перехватывало #2
вопрос двусмысленный.
все, что генерируется библиотекой STL - это исключения, которые унаследованы от стандартного std::exception.

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

Например при попытке вставить объект в вектор и в случае нехватки памяти вылетит стандартное std::bad_alloc. Но если память выделилась, дальше зовется конструктор копирования вставляемого объекта. Ну и из этого конструктора может вылететь что-угодно. Поэтому, если написать такой код:

C++
1
2
3
4
5
6
7
8
try
{
  vector<Foo> v;
  v.push_back(Foo());
}
catch (std::exception&)
{
}
То это не перехватит всех возможных исключений, которые могут возникнуть в данном коде.


Резюме: Какого-то базового исключения для всех типов исключений не существует.
Можно только ставить catch(...), но тут тип исключения неизвестен.
Надо сказать, есть хитрый трюк для идентификации типа исключения в рантайме, и его можно применить для преобразования одного типа исключения в другое. Но код преобразования нужно писать самостоятельно для каждого типа исключения.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 17:28  [ТС]     если ли стандартное исключение чтоб перехватывало #3
Цитата Сообщение от DU Посмотреть сообщение
вопрос двусмысленный.
все, что генерируется библиотекой STL - это исключения, которые унаследованы от стандартного std::exception.

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

Например при попытке вставить объект в вектор и в случае нехватки памяти вылетит стандартное std::bad_alloc. Но если память выделилась, дальше зовется конструктор копирования вставляемого объекта. Ну и из этого конструктора может вылететь что-угодно. Поэтому, если написать такой код:

C++
1
2
3
4
5
6
7
8
try
{
  vector<Foo> v;
  v.push_back(Foo());
}
catch (std::exception&)
{
}
То это не перехватит всех возможных исключений, которые могут возникнуть в данном коде.


Резюме: Какого-то базового исключения для всех типов исключений не существует.
Можно только ставить catch(...), но тут тип исключения неизвестен.
Надо сказать, есть хитрый трюк для идентификации типа исключения в рантайме, и его можно применить для преобразования одного типа исключения в другое. Но код преобразования нужно писать самостоятельно для каждого типа исключения.

т.е. придется самому класс для данного исключение писать или можно что то из буста вытащить ??? уже готовое (или из других библиотек ) ???
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 17:29     если ли стандартное исключение чтоб перехватывало #4
Цитата Сообщение от Leeto Посмотреть сообщение
что б перехватывало
а ля

C++
1
2
3
4
5
6
7
8
9
unsigned int a = - 2 ; 
 
try 
{
cout << a ; 
}
 
catch (??? ) 
{}
Даже если компилятор даст тебе положить туда -2 - это уже будет не -2, а чтото около 65533 наверно, т.к. отрицательные числа представляются старшим битом. Короче нет такого.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 17:39     если ли стандартное исключение чтоб перехватывало #5
Цитата Сообщение от Leeto Посмотреть сообщение
что б перехватывало
а ля

C++
1
2
3
4
5
6
7
8
9
unsigned int a = - 2 ; 
 
try 
{
cout << a ; 
}
 
catch (??? ) 
{}
Тут и не должно быть исключения. В переменной a у тебя будет лежать значение 4294967294.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 19:01  [ТС]     если ли стандартное исключение чтоб перехватывало #6
Цитата Сообщение от lazybiz Посмотреть сообщение
Тут и не должно быть исключения. В переменной a у тебя будет лежать значение 4294967294.
вот мне и на до чтоб там не 4294967294 а перехват был

Добавлено через 1 минуту
Цитата Сообщение от PSIAlt Посмотреть сообщение
Даже если компилятор даст тебе положить туда -2 - это уже будет не -2, а чтото около 65533 наверно, т.к. отрицательные числа представляются старшим битом. Короче нет такого.
чо самому писать что ли ???

это получается что а ля
если int_max (или как его там ) то ловить, да ?

А если я хочу немного с реюзабительностью а ля для дабл или лонг
если какая ниб стандартная функция которая возвращает макс значение примитивного типа ?:

а ля макс оф тайп
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 19:03     если ли стандартное исключение чтоб перехватывало #7
Цитата Сообщение от Leeto Посмотреть сообщение
вот мне и на до чтоб там не 4294967294 а перехват был

Добавлено через 1 минуту


чо самому писать что ли ???

это получается что а ля
если int_max (или как его там ) то ловить, да ?
Боюсь в твоем случае это нереально.
Возможно тут помогут какие-то специальные конструкции.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 19:05  [ТС]     если ли стандартное исключение чтоб перехватывало #8
Цитата Сообщение от lazybiz Посмотреть сообщение
Боюсь в твоем случае это нереально.
Возможно тут помогут какие-то специальные конструкции.
а как же там бед аллокейшен и все такое ??? это не из этой оперы ?

еще всякие там стандартые элементы видел (не юзал правда никогда ) под названием empty ??? мож они в тему будут

или там взять auto_ptr или boost::share_ptr и типа у них там вроде как эмпти тоже есть и проверять на емтинесс ???
ну типа если эмпти то перехватывать ???

такое прокатит как думаете госпада ? помогите пожалуйста
заранее спасибо
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 19:23     если ли стандартное исключение чтоб перехватывало #9
Leeto, C++11 это тупо скомпилировать не позволит (если использовать новый синтаксис инициализации).

http://liveworkspace.org/code/458576...f14a157d3252b1

Добавлено через 49 секунд
Leeto, Есть, которая возвращает максимум для типов...

C++
1
std::numeric_limits<T>::max();
Добавлено через 13 минут
а как же там бед аллокейшен и все такое ??? это не из этой оперы ?

еще всякие там стандартые элементы видел (не юзал правда никогда ) под названием empty ??? мож они в тему будут

или там взять auto_ptr или boost::share_ptr и типа у них там вроде как эмпти тоже есть и проверять на емтинесс ???
ну типа если эмпти то перехватывать ???
Вроде и буст юзаешь и многие другие вещи, а вопросы задаешь какие-то непонятные... Вопроса абсолютно не понял, причем тут smart пойнтеры вообще? Причем тут bad_alloc? Это инициализация стандартных типов. Прямая инициализация стандартных типов не контролируется ничем. Потому как size_t i = -1 не является некорректным.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
01.09.2012, 19:30  [ТС]     если ли стандартное исключение чтоб перехватывало #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Вроде и буст юзаешь и многие другие вещи, а вопросы задаешь какие-то непонятные...

да ну перестань я быдло кодер до сих пор ... юзаешь громко сказано... пытаюсь юзать ....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 19:56     если ли стандартное исключение чтоб перехватывало
Еще ссылки по теме:

Вывод UTF-8 символов на стандартное ус-во C++
C++ Сгенерировать исключение в случае, если файл не удалось открыть
Нужно ввести текст, если он больше 80 символов нужно чтоб он переходил на новую строку C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
01.09.2012, 19:56     если ли стандартное исключение чтоб перехватывало #11
Цитата Сообщение от Leeto Посмотреть сообщение
чо самому писать что ли ???
это получается что а ля
если int_max (или как его там ) то ловить, да ?
нет
просто проверь старший бит
C++
1
2
if((value&0x80000000)!=0)
  //ошибка
если ты не знаешь размер int
то можно написать так
C++
1
if(value&(0x01<<(sizeof(int)*8-1))!=0)
разумеется на машинах с байтом равным 8 битам

можно вот так
C++
1
if(value&(~((-1)/2))!=0)
Yandex
Объявления
01.09.2012, 19:56     если ли стандартное исключение чтоб перехватывало
Ответ Создать тему
Опции темы

Текущее время: 02:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru