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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Как кинуть исключение std::locale::global(std::locale(""); - C++

24.01.2013, 02:08. Просмотров 1004. Ответов 15
Метки нет (Все метки)

Добрый день.
Знаю, что на С можно так:
C
1
2
3
4
if (!setlocale(LC_ALL, "")) {
    perror("Couldn't set locale");
    exit(EXIT_FAILURE);
}
как сделать проверку на С++ используя std::locale::global(std::locale("")); ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2013, 02:08     Как кинуть исключение std::locale::global(std::locale("");
Посмотрите здесь:

C++ std::endl; и std::cout"/n"; - одно и то же?
C++ Получить текущий locale. (category, * locale)
Ошибка: отсутствует оператор ">>"; типы операндов: std::istream >> std::string C++
IntelliSense: отсутствует оператор "<<", соответствующий этим операндам типы операндов: std::basic_ostream<char, std::char_traits<char> C++
C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
C++ Error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::
Error C2664: Client::First: невозможно преобразовать параметр 1 из "std::queue<_Ty>" в "std::queue<_Ty> &" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.01.2013, 09:13     Как кинуть исключение std::locale::global(std::locale(""); #2
Конструктор класса std::locale, принимающий имя локали, генерируют исключение std::runtime_error, если не обнаруживают локали на системе.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.01.2013, 18:50  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #3
Покажите пожалуйста, как перехватить это исключение
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.01.2013, 19:24     Как кинуть исключение std::locale::global(std::locale(""); #4
C++
1
2
3
4
5
try {
  std::locale::global(std::locale(""));
} catch (std::runtime_error e) {
  std::cout << "Could not set global locale: " << e.what() << std::endl
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.01.2013, 20:56  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #5
А подскажите throw тогда в каких случаях нужно применять?
MrGluck
Ворчун
Эксперт CЭксперт С++
6417 / 3615 / 449
Регистрация: 29.11.2010
Сообщений: 9,563
24.01.2013, 21:27     Как кинуть исключение std::locale::global(std::locale(""); #6
xtorne21st, когда исключение не генерируется автоматически.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.01.2013, 21:55  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #7
Цитата Сообщение от MrGluck Посмотреть сообщение
xtorne21st, когда исключение не генерируется автоматически.
А как узнать когда оно автоматически генерируется, а когда нет?
MrGluck
Ворчун
Эксперт CЭксперт С++
6417 / 3615 / 449
Регистрация: 29.11.2010
Сообщений: 9,563
24.01.2013, 22:03     Как кинуть исключение std::locale::global(std::locale(""); #8
xtorne21st, читать спецификацию класса
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.01.2013, 22:14     Как кинуть исключение std::locale::global(std::locale(""); #9
Цитата Сообщение от xtorne21st Посмотреть сообщение
Как кинуть исключение std::locale::global(std::locale("");
Что за исключение такое?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
27.01.2013, 22:50  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #10
Цитата Сообщение от lemegeton Посмотреть сообщение
try { std::locale::global(std::locale("")); } catch (std::runtime_error e) { std::cout << "Could not set global locale: " << e.what() << std::endl }
А в конце ветки catch нужно ли использовать return -1 или программа сама завершит своё выполнение?

Добавлено через 1 час 38 минут
Ну типа аварийный выход?
lemegeton
2915 / 1344 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
28.01.2013, 01:21     Как кинуть исключение std::locale::global(std::locale(""); #11
Цитата Сообщение от xtorne21st Посмотреть сообщение
А в конце ветки catch нужно ли использовать return -1 или программа сама завершит своё выполнение?
Логика уже на ваше усмотрение. Мне кажется, что ошибка восстановима и работу программы можно продолжить, но я не пробовал.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.01.2013, 12:40     Как кинуть исключение std::locale::global(std::locale(""); #12
Цитата Сообщение от xtorne21st Посмотреть сообщение
А в конце ветки catch нужно ли использовать return -1 или программа сама завершит своё выполнение?
Нет. Не завершит. Мы для этого и перехватываем исключение. Если хотите аварийное завершение, то пробросте его дальше.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 13:48     Как кинуть исключение std::locale::global(std::locale(""); #13
xtorne21st, исключение - это для программиста. Если хотите выйти, то выходите ручками
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 14:11  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #14
Цитата Сообщение от go Посмотреть сообщение
Нет. Не завершит. Мы для этого и перехватываем исключение. Если хотите аварийное завершение, то пробросте его дальше.
Я просто читал, что вроде есть исключения, которые завршают выполнение программы: толи после всех веток catch, толи ещё какие-то случай - точно не знаю...

Добавлено через 58 секунд
Если вы помните, то дайте, пожалуйста, пример.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.01.2013, 14:15     Как кинуть исключение std::locale::global(std::locale(""); #15
xtorne21st, так если ты его поймал, то дальше оно не пойдет. И если ты в отловщике не напишешь выйти, то с чего он должен было бы выйти?

Добавлено через 29 секунд
Кстати, насчет исключений, я правильно понимаю, что они выходят "насквозь" через все функции, пока не достигнут отловщика/пока функции не кончатся ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 14:48     Как кинуть исключение std::locale::global(std::locale("");
Еще ссылки по теме:

Необработанное исключение в "0x76fd2eec" Microsoft C++: std::bad_alloc C++
Объясните, что означает wcout.imbue( locale( "rus_rus.866" ) ); и wcin.imbue( locale( "rus_rus.866" ) ); ? C++
отсутствует оператор "<<" соответствующий этим операндам (std::ostream << const std::string) C++
C++ Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"
C2678 бинарный ">>": не найден оператор, принимающий левый операнд типа "std::ostream" C++

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 14:48  [ТС]     Как кинуть исключение std::locale::global(std::locale(""); #16
Цитата Сообщение от Kgfq Посмотреть сообщение
Кстати, насчет исключений, я правильно понимаю, что они выходят "насквозь" через все функции, пока не достигнут отловщика/пока функции не кончатся ?
Будут проходить через все ветки catch и если не смогут быть обработаны, то програма завершиться (кажется аварийно). Я об этом читал, но как реализовать не знал. Я просто считал, что если ошибка не будет обработана то программа завершиться автоматически, а как оказывается нужно ещё в конце поставить что-то типа exit(1);

B вот ещё пытаюсь обработать ошибку таким образом, но компилятор выдаёт предупреждение:
Bash
1
2
3
4
test.cpp:15:7: warning: exception of type ‘std::runtime_error’ will be caught [enabled by default]
test.cpp:12:7: warning:    by earlier handler for ‘std::runtime_error’ [enabled by default]
test.cpp:18:7: warning: exception of type ‘std::runtime_error’ will be caught [enabled by default]
test.cpp:15:7: warning:    by earlier handler for ‘std::runtime_error’ [enabled by default]
Как можно сделать это более, элегантным способом, чтобы компилятор (gcc) не нервничал?
C++
1
2
3
4
5
6
7
8
9
10
11
12
    try {
    std::locale::global(std::locale(""));
    } catch (std::runtime_error bad_locale_error) {
        std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl;
        std::locale::global(std::locale("en_US.utf8"));
    } catch (std::runtime_error bad_locale_error) {
        std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl;
        std::locale::global(std::locale("Russian"));
    } catch (std::runtime_error bad_locale_error) {
        std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl;
        exit(1);
    }
Добавлено через 2 минуты
Пс. Принципе, он жалуется на то, что я всегда использую одно и тоже исключение: std::runtime_error. Как можно этого избежать не теряя смысл в ветке try?

Добавлено через 10 минут
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
try { std::locale::global(std::locale("")); } catch (std::runtime_error bad_locale_error) { std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl; std::locale::global(std::locale("en_US.utf8")); } catch (std::runtime_error bad_locale_error) { std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl; std::locale::global(std::locale("Russian")); } catch (std::runtime_error bad_locale_error) { std::cerr << "Couldn't set global locale: " << bad_locale_error.what() << std::endl; exit(1); }
Как оказалось - это вообще ошибочный код. Так как мне сделать, чтобы оно пыталось в теле try автоматически выставить локаль?
Yandex
Объявления
28.01.2013, 14:48     Как кинуть исключение std::locale::global(std::locale("");
Ответ Создать тему
Опции темы

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