Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

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

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

Author24 — интернет-сервис помощи студентам
Какие ещё, кроме std::bad_alloc, есть коды исключений? Содержит ли исключение информацию о месте своего возникновения? А о конкретной операции, из-за которой оно возникло? А что конкретно не так с этой операцией?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2012, 06:58
Ответы с готовыми решениями:

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

Обработка исключений
Ребят, всем привет) помогите разобраться с вроде как простой задачкой, но весьма затруднительной...

Обработка исключений
Доброго времени суток. Использую RAD XE 4. Пытаюсь поймать исключения путем catch(Exeption...

класс исключений
class exception { public: exception() throw(); exception(const bad_exception &ob) throw();...

16
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
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
Higher
1953 / 1219 / 120
Регистрация: 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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
Higher
1953 / 1219 / 120
Регистрация: 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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.06.2012, 09:50  [ТС] 6
Цитата Сообщение от diagon Посмотреть сообщение
Вроде overflow/underflow, только для вещественных типов.
чем они от остальных отличаются я и не спрашиваю. Мне интересно, что они означают. И, если это не стек, то что означают оба.

Добавлено через 1 минуту
Всё таки не понятно, чем отличается std::range_error от std::out_of_range.
0
Higher
1953 / 1219 / 120
Регистрация: 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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.06.2012, 10:37  [ТС] 8
Цитата Сообщение от dimcoder Посмотреть сообщение
Какие еще коды? bad_alloc - это класс.
Эйси. Но его зназвание ни откуда не вытекает и больше ни где не участвует, догадаться не возможно. Значит класс с кодированным названием. То есть код.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.06.2012, 13:59  [ТС] 10
Цитата Сообщение от rangerx Посмотреть сообщение
Утечка памяти.
откуда?

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

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

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
откуда?
оттуда, в коде из 2-го поста нет ни одного delete
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 11
05.06.2012, 15:54 14
Как называется исключение, когда в переменную добавляется пустой Edit??
C++
1
D = StrToInt(Edit15->Text);
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.06.2012, 15:55  [ТС] 15
Цитата Сообщение от Jupiter Посмотреть сообщение
а кто такой гога?
гога, он же егог - ошибка.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
06.06.2012, 21:39 16
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем это поможет?
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге... Если тебя интересует обработка каждой отдельной функции с помощью try\catch, см. здесь
Цитата Сообщение от taras atavin Посмотреть сообщение
Но вот если new сам бросит исклюкаку...
...вызовится std::teminate(). Вообще, на мой взгляд классы обработки исключений не должны сами выбрасывать исключения, тем не менее многие стандартные классы используют std::string, который точно так же может бросить std::bad_alloc. Подобные вещи естественно необходимо учитывать.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.06.2012, 06:58  [ТС] 17
Цитата Сообщение от rangerx Посмотреть сообщение
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге...
Что не понятного? Есть тело моей функции, в ней много вызовов функций, которые писал не я и они могут быть уже собраны в натив, любая из них может бросить исключение и какая то из них его бросила, надо определить, в какой строке моего исходного кода и с какими параметрами была вызвана функция, бросиывшая исключение. Корень и арксинус приведены только как примеры ограничения на область определения, настоящие функции могут отличаться, имея это же свойство, а исключение std::invalid_argument бросать программно.
0
07.06.2012, 06:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2012, 06:58
Помогаю со студенческими работами здесь

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

Обработка исключений
класс B является производным от абстрактного класса А. Определить обработчик исключительной...

Обработка исключений
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include...

Обработка исключений
Добрый день! Столкнулся с такой проблемой. У меня есть класс class MyClass { public: ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru