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

Не ловит exception - C++

Восстановить пароль Регистрация
 
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
17.06.2013, 21:07     Не ловит exception #1
Почему не ловится range error?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <stdexcept>
#include <string>
 
using namespace std;
 
int main()
try
{
    string s = "Success!\n"; for (int i=0; i<=10; ++i) cout << s[i];
    return 0;
}
 
catch (exception& e)
{
    cerr << "error: " << e.what() << '\n';
    return 1;
}
 
catch (...)
{
    cerr << "Unknown exception!\n";
    return 2;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 21:07     Не ловит exception
Посмотрите здесь:

Unhandled exception C++
exception и cerr C++
ПОЧЕМУ std::erxception не ловит ошибку? C++
Exception C++
C++ exception
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
17.06.2013, 21:23     Не ловит exception #2
Оператор [] не бросает исключений. Если нужна проверка выхода за границы используй at.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
20.06.2013, 00:12  [ТС]     Не ловит exception #3
а что здесь может генерировать неизвестное исключение? (ветка Unknown exception)

Добавлено через 26 минут
или что вообще может генерировать неизвестное исключение?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
20.06.2013, 02:50     Не ловит exception #4
Цитата Сообщение от Dani Посмотреть сообщение
а что здесь может генерировать неизвестное исключение? (ветка Unknown exception)
В данном случае ничего. Все стандартные типы исключений являются наследниками std::exception, следовательно любое из этих исключений будет перехвачено в первом же блоке.
Цитата Сообщение от Dani Посмотреть сообщение
или что вообще может генерировать неизвестное исключение?
Если, например, обработчик std::exception заменить на обработчик std::bad_alloc(ошибка выделения памяти), то исключение std::out_of_range, генерируемое методом at попадёт как раз в последний блок, т.к. его обработчик не был предусмотрен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try
{
    string s = "Success!\n"; for (int i=0; i<=10; ++i) cout << s.at(i);
    return 0;
}
 
catch (bad_alloc& e)
{
    cerr << "error: " << e.what() << '\n';
    return 1;
}
 
catch (...)
{
    cerr << "Unknown exception!\n";
    return 2;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
20.06.2013, 02:54     Не ловит exception #5
Dani, кидают range_error лишь контейнеры STL, да и то при методе at (некоторые реализации кидают и при обычном [], но гарантии в этом нет).

Цитата Сообщение от Dani Посмотреть сообщение
а что здесь может генерировать неизвестное исключение? (ветка Unknown exception)
а туда просто сыплется все, что ни попадя. Т.к. фактически стандартного исключения для вашего случая нет, то приходит как раз в это (последнее) ветвление, минуя все стандартные.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2013, 11:43     Не ловит exception #6
Цитата Сообщение от MrGluck Посмотреть сообщение
некоторые реализации кидают и при обычном []
Кстати, недавно почитывал у Страуструпа про std::bitset что, цитирую:
Операция индексирования генерирует исключение out_of_range, когда индекс выходит за границы набора битов. Индексации без проверки индекса нет.
Правда по факту получить исключение удалось только на bitset<0>. https://ideone.com/kgfex2
В других случаях выход за диапазон не отлавливается.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.06.2013, 11:51     Не ловит exception #7
Tulosba,
C++
1
constexpr bool operator[](size_t pos);
49 Requires: pos shall be valid.
50 Returns: true if the bit at position pos in *this has the value one, otherwise false.
51 Throws: Nothing.
C++
1
bitset<N>::reference operator[](size_t pos);
52 Requires: pos shall be valid.
53 Returns: An object of type bitset<N>::reference such that (*this)[pos] == this->test(pos),
and such that (*this)[pos] = val is equivalent to this->set(pos, val).
54 Throws: Nothing.
55 Remark: For the purpose of determining the presence of a data race (1.10), any access or update
through the resulting reference potentially accesses or modifies, respectively, the entire underlying
bitset.
В С++03 тоже самое, только возвращающий bool - не constexpr. А в С++98 не написано про этот оператор вообще ничего.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2013, 12:00     Не ловит exception #8
ForEveR, за что купил, за то и продаю На bitset<0> ловим исключение (см. предыдущий пост).
А вот интересно, почему бы не объявить оператор как noexcept, если он по стандарту Throws: Nothing. ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.06.2013, 12:08     Не ловит exception #9
Tulosba, http://www.open-std.org/jtc1/sc22/wg...2011/n3248.pdf

The other concern in this class is the operator[] overload, which now prohibits checked implementations. Unless the core language behavior can be weakened, this operator should not be declared noexcept.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2013, 12:23     Не ловит exception #10
ForEveR, честно говоря, не очень понял. Что значит:
Цитата Сообщение от ForEveR Посмотреть сообщение
Unless the core language behavior can be weakened
?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.06.2013, 12:28     Не ловит exception #11
Tulosba, Ну там, всю статью надо читать. В N3242 оба эти оператора были noexcept.
C++
1
constexpr bool operator[](size_t pos) noexcept;
49 Requires: pos shall be valid.
50 Returns: true if the bit at position pos in *this has the value one, otherwise false.
C++
1
bitset<N>::reference operator[](size_t pos) noexcept;
51 Requires: pos shall be valid.
52 Returns: An object of type bitset<N>::reference such that (*this)[pos] == this->test(pos),
and such that (*this)[pos] = val is equivalent to this->set(pos, val).
53 Remark: For the purpose of determining the presence of a data race (1.10), any access or update
through the resulting reference potentially accesses or modifies, respectively, the entire underlying
bitset.
В N3337 уже нет.

На тему данного дока, покидаю нужные цитатки
Wide Contracts
A wide contract for a function or operation does not specify any undefined behavior. Such a contract has no preconditions: A function with a wide contract places no additional constraints on its arguments, on any object state, nor on any external global state. Examples of functions having wide contracts would be vector<T>::begin() and vector<T>::at(size_type) . Examples of functions not having a wide contract would be vector<T>::front() and vector<T>::operator[](size_type).

Narrow Contracts
A narrow contract is a contract which is not wide. Narrow contracts for a functions or operations result in undefined behavior when called in a manner that violates the documented contract. Such a contract specifies at least one precondition involving its arguments, object state, or some external global state, such as the initialization of a static object. Good examples of standard functions with narrow contracts are vector<T>::front() and vector<T>::operator[](size_type)

Alternative additional recommendation
If the core language is not amended to support a testing mode, we recommend the following guideline:
• Remove noexcept specifications from each library function having a narrow contract, typically (but not always) indicated by the presence of a Requirements: clause
В частности bitset<N>::operator[] имеет narrow contract, т.к. проверки запрещены, данные передаются от пользователя, не соблюдение precondition есть UB.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 12:49     Не ловит exception
Еще ссылки по теме:

C++ Обработка exception
C++ exception C++
First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2013, 12:49     Не ловит exception #12
Кажется стало проясняться. Если вызов функции может привести к UB (узкий контракт), то объявлять её noexcept не рекомендуется, ибо в тестовом (отладочном) режиме всё же имеет смысл (определяется реализацией) кинуть исключение вместо получения UB.
Yandex
Объявления
20.06.2013, 12:49     Не ловит exception
Ответ Создать тему
Опции темы

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