Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
1

try, catch, throw

07.12.2012, 03:34. Показов 1764. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пишу класс
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
namespace mystd
{
 
    const uint32_t def_size = 1 << 20; //default memory container
 
    template<typename T>
    class vector
    {
    public:
 
        vector() : size(def_size)
        {
            head = presnt = tail = (T*)NULL;
        }
        
        int push_back(T data)
        {
            T *tmp = new T;
            
            try
            {
                tmp->next = NULL;
            }
            catch () //<<<----------------------??????????????????
            {
                
            }
            
            if (head == NULL)
            {
                head = presnt = tail = tmp;
            }
                
        }
        
    private:
        uint32_t size;
        T *head;
        T *presnt;
        T *tail;
    };
}
Что мне ловить в catch? как работает throw?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2012, 03:34
Ответы с готовыми решениями:

throw, try, catch
Пожалуйста, помогите разобраться в том, что это такое, и как его правильно использовать. Где можно...

Try..catch..Throw
Объясните пожалуйста разницу. Желательно с примерами, например деление на ноль, ну или чтобы было...

Try, catch, throw
Подскажите, как с помощью try, catch, throw, обработать исключение на вводимый тип данных?...

try-throw-catch
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class Drob { public: int...

5
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
07.12.2012, 04:38 2
Смотря какая ошибка.
Пример:
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
#include <iostream>
#include <stdexcept>
 
int divide( int a, int b ) {
   if ( a == 0 )
      throw std::runtime_error( "Exception occurred: Division by zero." );
 
   return a / b;
}
 
int main() {
   int result;
 
   try {
      result = divide( 10, 2 );
 
      std::cout << result << std::endl;
   } catch ( std::runtime_error &error ) {
      std::cout << error.what() << std::endl;
   }
 
   try {
      result = divide( 10, 0 );
 
      std::cout << result << std::endl;
   } catch ( std::runtime_error &error ) {
      std::cout << error.what() << std::endl;
   }
 
   return 0;
}
Можно так же кидать исключения прям в try блоке. В catch обрабатывается тип исключения ( в общем случае - это объект класса ), который указывается в скобках. Для обработки всех возможных исключений используется многоточие
C++
1
catch ( ... )
Но в данном случае нельзя получить доступ к объекту класса исключения. Если catch блоков несколько, то выбирается первых подходящий. То есть если выбрасывается объект какого то производного класса ( например тот же std::runtime_error, который является производным от std::exception ), а первый в обработчиках идет объект базового класса ( например std::exception ), то будет выбран именно он.
пример:
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
#include <iostream>
#include <exception>
#include <stdexcept>
 
int div( int a, int b ) {
   if ( b == 0 )
      throw std::runtime_error( "Exception occurred: Division by zero." );
 
   return a / b;
}
 
int main() {
   int result;
 
   try {
      result = div( 10, 0 );
 
      std::cout << result << std::endl;
   } catch ( std::exception &error ) {
      std::cout << "std::exception: " << error.what() << std::endl;
   } catch ( std::runtime_error &error ) {
      std::cout << "std::runtime_error: " << error.what() << std::endl;
   }
 
   return 0;
}
Если подходящего обработчика не обнаружено, то исключение пробрасывается дальше вниз по стеку, пока необходимый обработчик не будет найден, или не будет достигнуто начало стека, в это случае приложение аварийно завершится. В принципе, можно бросать любые типы в качестве исключения, например, тот же int или double. И обрабатывать их соответствующими обработчиками ( catch ( int err ), catch ( double err ) ), но сомневаюсь, что это хорошая идея.
0
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
07.12.2012, 05:02  [ТС] 3
а где есть список всехз доступных исключений? Какие пункты и в какой редакции стандарта?

Добавлено через 2 минуты
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
07.12.2012, 05:07 4
activnaya, бросаются всего лишь объекты. Это не какая то сложная система. Вы можете создать свой класс исключения, например MyException, тогда при записи
C++
1
throw MyException();
будет создан безымянный объект класса MyException, и который можно будет поймать обработчиком
C++
1
catch( MyException &object )
В стандарте есть несколько классов исключений. Каждый из них является производным от класса std::exception.

Добавлено через 1 минуту
Цитата Сообщение от activnaya Посмотреть сообщение
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
Необязательно печать, Вы можете делать все необходимые действия в блоке catch выброшенного исключения. И нет, это не тоже самое, что и return.

Все операторы идущие после выброса исключения пропускаются. То есть например в моем примере
C++
1
result = div( 10, 0 );
Переменной result не будет ничего присвоено, так как функция div выбросила исключение. Так же не будет выполнятся идущая далее строка
C++
1
 std::cout << result << std::endl;
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
07.12.2012, 06:03 5
Цитата Сообщение от activnaya Посмотреть сообщение
а где есть список всехз доступных исключений?
Выбросить можно любое значение, например:
C++
1
2
3
4
5
try {
   throw "fail";
} catch (char const* str) {
   std::cerr << str << std::endl;
}
Правда выбрасывать что-либо, не унаследованное от std::exception всё же не стоит)
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
09.12.2012, 18:53 6
Цитата Сообщение от activnaya Посмотреть сообщение
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
Нет, он просто бросает исключение? Или вы об отдельно стоящем throw в блоке catch? Тогда происходит просто проброска исключения. Ловить все равно будем на более высоком уровне, например для защиты ресурсов, т. е. иммитация try - finaly
1
09.12.2012, 18:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2012, 18:53
Помогаю со студенческими работами здесь

Try,catch,throw,OVERFLOW!
Добрый вечер! И СНОВА с вами try..catch...:p Я очень долго пытался понять try-catch сам, читал...

Try Throw Catch пример
Как-то не особо много инфы нарыл по данной теме... Может у кого есть какие уже реализованные...

Try throw catch в решении уравнения
Есть уравнение y=1/sqrt(x-3). нужно считать x, пусть он будет целым. а затем с помощью...

try, throw, catch...обработка исключений
помогите разобраться с обработкой исключений...при вводе пароля больше 10 символов должна быть...

C++ try catch throw в разных функциях
try и catch находятся в одной функции а throw вызывается из другой. ну MVS выкидывает исключение...

Try - catch - throw для чего они
Есть код программы принимающей температуру и заводит в вектор, она еще не доработана, Страуструп...


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

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