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

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

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 06:58     Коды исключений #1
Какие ещё, кроме std::bad_alloc, есть коды исключений? Содержит ли исключение информацию о месте своего возникновения? А о конкретной операции, из-за которой оно возникло? А что конкретно не так с этой операцией?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
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;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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, умеющий бросать свою исклюкаку. Блеск и треск!
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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
Вообще, по ссылке выше все должно быть написано.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 09:50  [ТС]     Коды исключений #6
Цитата Сообщение от diagon Посмотреть сообщение
Вроде overflow/underflow, только для вещественных типов.
чем они от остальных отличаются я и не спрашиваю. Мне интересно, что они означают. И, если это не стек, то что означают оба.

Добавлено через 1 минуту
Всё таки не понятно, чем отличается std::range_error от std::out_of_range.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 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 у вектора и стринга).
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 10:37  [ТС]     Коды исключений #8
Цитата Сообщение от dimcoder Посмотреть сообщение
Какие еще коды? bad_alloc - это класс.
Эйси. Но его зназвание ни откуда не вытекает и больше ни где не участвует, догадаться не возможно. Значит класс с кодированным названием. То есть код.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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 используют для обработки программных исключений. Какие исключения генерируют стандартные функции/классы см. в документации к этим самым фунциям/классам.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 13:59  [ТС]     Коды исключений #10
Цитата Сообщение от rangerx Посмотреть сообщение
Утечка памяти.
откуда?

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

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

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
откуда?
оттуда, в коде из 2-го поста нет ни одного delete
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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;
    }
}
если ты имеешь в виду это.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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 сам бросит исклюкаку...
Alejandro
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 11
05.06.2012, 15:54     Коды исключений #14
Как называется исключение, когда в переменную добавляется пустой Edit??
C++
1
D = StrToInt(Edit15->Text);
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 15:55  [ТС]     Коды исключений #15
Цитата Сообщение от Jupiter Посмотреть сообщение
а кто такой гога?
гога, он же егог - ошибка.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.06.2012, 21:39     Коды исключений #16
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем это поможет?
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге... Если тебя интересует обработка каждой отдельной функции с помощью try\catch, см. здесь
Цитата Сообщение от taras atavin Посмотреть сообщение
Но вот если new сам бросит исклюкаку...
...вызовится std::teminate(). Вообще, на мой взгляд классы обработки исключений не должны сами выбрасывать исключения, тем не менее многие стандартные классы используют std::string, который точно так же может бросить std::bad_alloc. Подобные вещи естественно необходимо учитывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 06:58     Коды исключений
Еще ссылки по теме:

Обработка исключений C++
C++ Обработка исключений
Обработка исключений C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.06.2012, 06:58  [ТС]     Коды исключений #17
Цитата Сообщение от rangerx Посмотреть сообщение
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге...
Что не понятного? Есть тело моей функции, в ней много вызовов функций, которые писал не я и они могут быть уже собраны в натив, любая из них может бросить исключение и какая то из них его бросила, надо определить, в какой строке моего исходного кода и с какими параметрами была вызвана функция, бросиывшая исключение. Корень и арксинус приведены только как примеры ограничения на область определения, настоящие функции могут отличаться, имея это же свойство, а исключение std::invalid_argument бросать программно.
Yandex
Объявления
07.06.2012, 06:58     Коды исключений
Ответ Создать тему
Опции темы

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