Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
1

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

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

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

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

Классы исключений
расскажите, пожалуйста, про предопределенные классы исключений

Обработка исключений
Необходимо создать три массива a, b и с размерами соответственно n1, n2 и n3...

Обработка исключений
Есть код программы по поиску совершенных чисел а интервале от a до n. ...

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

16
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,144
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
1937 / 1203 / 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
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
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
1937 / 1203 / 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
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.06.2012, 09:50  [ТС] 6
Цитата Сообщение от diagon Посмотреть сообщение
Вроде overflow/underflow, только для вещественных типов.
чем они от остальных отличаются я и не спрашиваю. Мне интересно, что они означают. И, если это не стек, то что означают оба.

Добавлено через 1 минуту
Всё таки не понятно, чем отличается std::range_error от std::out_of_range.
0
diagon
Higher
1937 / 1203 / 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
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.06.2012, 10:37  [ТС] 8
Цитата Сообщение от dimcoder Посмотреть сообщение
Какие еще коды? bad_alloc - это класс.
Эйси. Но его зназвание ни откуда не вытекает и больше ни где не участвует, догадаться не возможно. Значит класс с кодированным названием. То есть код.
0
rangerx
1944 / 1553 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
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
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.06.2012, 13:59  [ТС] 10
Цитата Сообщение от rangerx Посмотреть сообщение
Утечка памяти.
откуда?

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

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

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
откуда?
оттуда, в коде из 2-го поста нет ни одного delete
0
rangerx
1944 / 1553 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
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
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
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
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
05.06.2012, 15:55  [ТС] 15
Цитата Сообщение от Jupiter Посмотреть сообщение
а кто такой гога?
гога, он же егог - ошибка.
0
rangerx
1944 / 1553 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
06.06.2012, 21:39 16
Цитата Сообщение от taras atavin Посмотреть сообщение
И чем это поможет?
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге... Если тебя интересует обработка каждой отдельной функции с помощью try\catch, см. здесь
Цитата Сообщение от taras atavin Посмотреть сообщение
Но вот если new сам бросит исклюкаку...
...вызовится std::teminate(). Вообще, на мой взгляд классы обработки исключений не должны сами выбрасывать исключения, тем не менее многие стандартные классы используют std::string, который точно так же может бросить std::bad_alloc. Подобные вещи естественно необходимо учитывать.
0
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
07.06.2012, 06:58  [ТС] 17
Цитата Сообщение от rangerx Посмотреть сообщение
Я честно говоря не совсем понял, что ты хочешь получить в конечном итоге...
Что не понятного? Есть тело моей функции, в ней много вызовов функций, которые писал не я и они могут быть уже собраны в натив, любая из них может бросить исключение и какая то из них его бросила, надо определить, в какой строке моего исходного кода и с какими параметрами была вызвана функция, бросиывшая исключение. Корень и арксинус приведены только как примеры ограничения на область определения, настоящие функции могут отличаться, имея это же свойство, а исключение std::invalid_argument бросать программно.
0
07.06.2012, 06:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 06:58

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

Обработка исключений
Проблема. В main создаю объект класса MAS int или string. Нужно, что бы когда...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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