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

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

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Коды исключений - C++

05.06.2012, 06:58. Просмотров 964. Ответов 16
Метки нет (Все метки)

Какие ещё, кроме std::bad_alloc, есть коды исключений? Содержит ли исключение информацию о месте своего возникновения? А о конкретной операции, из-за которой оно возникло? А что конкретно не так с этой операцией?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 06:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Коды исключений (C++):

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не подходящего" типа вызывается необработанное...

обработка исключений - C++
Здравствуйте. В следующем коде, при запуске throw выдает ошибку "Exception object adress". Не понимаю почему. Подскажите пожалуйста. ...

Обработка исключений - C++
Объясните мне толком для чего используются эти обработки исключений (Try, catch, throw). Сколько не читаю, не могу понять для чего и как...

Трансляция исключений - C++
Дайте пожалуйста простенький пример, где я ловлю исключение и кидаю его через throw на еще один обработчик catch

Использование исключений - C++
Мне нужно сделать так, чтоб если я введу не число, чтоб выдало собственное исключение, чего-то данный код не срабатывает. Получается в...

Обработка исключений - C++
Нужно описать класс исключения и программу, способную генерировать и обрабатывать исключение (должна содержать блоки try, catch, throw)....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dimcoder
Полярный
462 / 434 / 68
Регистрация: 11.09.2011
Сообщений: 1,132
05.06.2012, 07:26 #2
Цитата Сообщение от taras atavin Посмотреть сообщение
Какие ещё, кроме std::bad_alloc, есть коды исключений?
Какие еще коды? bad_alloc - это класс. И "выбрасываем" мы объект этого класса при определенных условиях. Если хотим передать инфу через объект, нужно что бы этот объект хранил эту инфу. Можно сделать записать информацию через конструктор непосредственно при выбросе.

Вот пример передачи инфы:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <cstdio>
#include <iostream>
#include <myfunc.h>
 
using namespace std;
 
class my_Exception
{
    public:
    my_Exception(const char * s2)
    {
        s = new char[strlen(s2)+1];
        strcpy(s, s2);
    }
    
    const char * what() const
    {
        return s;
    }
    
    private:
    char *s;
};
 
int main(int intArgc, char* pszArgs[])
{
    try
    {
        throw my_Exception("MISTAKE");
    }
    catch (my_Exception ex)
    {
        cout << ex.what() << endl;
    }
    system("PAUSE > NULL");   
    return EXIT_SUCCESS;
}
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.06.2012, 07:28 #3
Цитата Сообщение от taras atavin Посмотреть сообщение
Какие ещё, кроме std::bad_alloc, есть коды исключений
http://en.cppreference.com/w/cpp/error/exception
2
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 09:43  [ТС] #4
А в чём разница между
std::range_error
,
std::length_error
и
std::out_of_range
? И что такое
std::underflow_error
?

Добавлено через 7 минут
Цитата Сообщение от dimcoder Посмотреть сообщение
throw my_Exception("MISTAKE");
При чём здесь свой throw? Когда гога предсказуема, её и без исключений легко поймать и инфа в лог перед throw попадёт. А вот как быть, если длинный расчёт и в любом месте может попасться значение вне области определений, типа -1 для корня квадратного, или двойки для арксинуса, выход за границу массива, или ещё какая пакость? И как потом узнать, в каком месте гога? Особенно если перед ней пара миллиардов вызов того же самого, но без гоги и не по счётчику.

Добавлено через 1 минуту
Цитата Сообщение от dimcoder Посмотреть сообщение
public: my_Exception(const char * s2) { s = new char[strlen(s2)+1]; strcpy(s, s2); }
В исключении new, умеющий бросать свою исклюкаку. Блеск и треск!
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.06.2012, 09:46 #5
Цитата Сообщение от taras atavin Посмотреть сообщение
std::range_error
Вроде overflow/underflow, только для вещественных типов.

Цитата Сообщение от taras atavin Посмотреть сообщение
std::length_error
Ну, например, это исключение возбудится, если вы попробуете вызвать vector::resize с слишком большим аргументом(больше, чем vector::max_size)

Цитата Сообщение от taras atavin Посмотреть сообщение
std::underflow_error
То же, что и overflow, только наоборот.
Например
C++
1
2
MAX_INT + 1; //overflow
MIN_INT - 1; //underflow
Вообще, по ссылке выше все должно быть написано.
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 09:50  [ТС] #6
Цитата Сообщение от diagon Посмотреть сообщение
Вроде overflow/underflow, только для вещественных типов.
чем они от остальных отличаются я и не спрашиваю. Мне интересно, что они означают. И, если это не стек, то что означают оба.

Добавлено через 1 минуту
Всё таки не понятно, чем отличается std::range_error от std::out_of_range.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.06.2012, 09:57 #7
Цитата Сообщение от taras atavin Посмотреть сообщение
std::range_error
Выход за границы вещественного типа.
Что может его генерировать в STL - не знаю, не встречал.

Цитата Сообщение от taras atavin Посмотреть сообщение
std::out_of_range
Выход за границы массива(к примеру, генерируется методом at у вектора и стринга).
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 10:37  [ТС] #8
Цитата Сообщение от dimcoder Посмотреть сообщение
Какие еще коды? bad_alloc - это класс.
Эйси. Но его зназвание ни откуда не вытекает и больше ни где не участвует, догадаться не возможно. Значит класс с кодированным названием. То есть код.
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
05.06.2012, 13:21 #9
Цитата Сообщение от dimcoder Посмотреть сообщение
s = new char[strlen(s2)+1];
Утечка памяти.
Цитата Сообщение от dimcoder Посмотреть сообщение
catch (my_Exception ex)
Исключения желательно перехватывать всегда только по ссылке.
C++
1
catch (my_Exception& ex)
Цитата Сообщение от taras atavin Посмотреть сообщение
При чём здесь свой throw? Когда гога предсказуема, её и без исключений легко поймать и инфа в лог перед throw попадёт. А вот как быть, если длинный расчёт и в любом месте может попасться значение вне области определений, типа -1 для корня квадратного, или двойки для арксинуса, выход за границу массива, или ещё какая пакость? И как потом узнать, в каком месте гога? Особенно если перед ней пара миллиардов вызов того же самого, но без гоги и не по счётчику.
Что значит "свой throw" или "не свой throw"? Отрицательное число для квадратного корня это аппаратное исключение. Такие исключения не ловят с помощью try/catch. try/catch используют для обработки программных исключений. Какие исключения генерируют стандартные функции/классы см. в документации к этим самым фунциям/классам.
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 13:59  [ТС] #10
Цитата Сообщение от rangerx Посмотреть сообщение
Утечка памяти.
откуда?

Добавлено через 3 минуты
Цитата Сообщение от rangerx Посмотреть сообщение
Что значит "свой throw" или "не свой throw"?
А то и значит, в каком тексте он прописан. В своём - не проблема вывести в лог всю инфу и только потом бросить, в вызываемом - вообще нельзя трогать ни само исключение, ни бросалку.

Добавлено через 2 минуты
Цитата Сообщение от rangerx Посмотреть сообщение
Какие исключения генерируют стандартные функции/классы см. в документации к этим самым фунциям/классам.
Ну посмотрел я. И что? А если 10 вызываемых функций может бросать одни и те же и каждая в сотне разных мест? Как понять, какой из тысячи вызовов бросает? Хорошо, когда можно коментить куски. А если нет?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.06.2012, 14:40 #11

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Когда гога предсказуема
а кто такой гога?



Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
откуда?
оттуда, в коде из 2-го поста нет ни одного delete
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
05.06.2012, 15:14 #12
Цитата Сообщение от taras atavin Посмотреть сообщение
откуда?
new есть, delete нет. Каждый раз при генерации исключения и его обработке память будет выделяться без освобождения.
Цитата Сообщение от taras atavin Посмотреть сообщение
А то и значит, в каком тексте он прописан. В своём - не проблема вывести в лог всю инфу и только потом бросить
Исключение можно бросить повторно
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <stdexcept>
 
class some_class
{
    public:
        some_class()
        {
            throw std::runtime_error("runtime_error!!!");
        }
};
 
void func()
{
    try
    {
        some_class sc;
    }
 
    catch(std::runtime_error&)
    {
        // ...
        std::clog << "...in void func()...\n";
        // ...
 
        // генерируем исключение повторно
        throw;
    }
}
 
int main()
{
    try
    {
        func();
    }
 
    catch(std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}
если ты имеешь в виду это.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 15:54  [ТС] #13
Цитата Сообщение от rangerx Посмотреть сообщение
Исключение можно бросить повторно
И чем это поможет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
try
{
 do /*Цикл на пару триллионов итераций*/
 {
  /*Пара тысяч строк расчёта*/
  /*В одной из них в вызываемой функции/операторе сработало исключение*/
  /*Ещё тысяч шесть строк расчёта*/
 } while (/*условие*/)
}
catch (/*Тип того исключения*/)
{
 throw (/*Не что*/); /*Если я не знаю, из какой строки прилетело
 первое исключение, то какой толк от этой строки?*/
}
Добавлено через 2 минуты
Цитата Сообщение от rangerx Посмотреть сообщение
new есть, delete нет. Каждый раз при генерации исключения и его обработке память будет выделяться без освобождения.
А в wat дописать delete []? Но вот если new сам бросит исклюкаку...
0
Alejandro
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 11
05.06.2012, 15:54 #14
Как называется исключение, когда в переменную добавляется пустой Edit??
C++
1
D = StrToInt(Edit15->Text);
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 15:55  [ТС] #15
Цитата Сообщение от Jupiter Посмотреть сообщение
а кто такой гога?
гога, он же егог - ошибка.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2012, 15:55
Привет! Вот еще темы с ответами:

Обработка исключений - C++
Как в блоке Try...Catch... обработать необработанное исключение по адресу? Что необходимо использовать в параметрах catch?

Обработка исключений - C++
Подскажите пожалуйста как продолжить выполнение программы после срабатывания оператора catch. catch завершает программу, но ее нужно...

Обработка исключений - C++
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include &lt;iostream&gt; using namespace std; ...

Обработка исключений - C++
Добрый вечер. Нужно обработать 5 исключений, я 3 обработал(и то мб неверно), а другие не могу придумать пока. Вот код: #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.06.2012, 15:55
Ответ Создать тему
Опции темы

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