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

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

Войти
Регистрация
Восстановить пароль
 
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
#1

try, catch, throw - C++

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

пишу класс
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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 03:34     try, catch, throw
Посмотрите здесь:

C++ throw, try, catch
Try..catch..Throw C++
try-throw-catch C++
Try Throw Catch пример C++
try, throw, catch...обработка исключений C++
C++ Посоветуйте пособие по использованию конструкции try/catch/throw
try catch throw для чего нужны? C++
C++ C++ try catch throw в разных функциях
C++ Try throw catch в решении уравнения
Try - catch - throw для чего они C++
C++ Try,catch,throw,OVERFLOW!
C++ Try, catch, throw

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.12.2012, 04:38     try, catch, throw #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 ) ), но сомневаюсь, что это хорошая идея.
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
07.12.2012, 05:02  [ТС]     try, catch, throw #3
а где есть список всехз доступных исключений? Какие пункты и в какой редакции стандарта?

Добавлено через 2 минуты
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.12.2012, 05:07     try, catch, throw #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;
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
07.12.2012, 06:03     try, catch, throw #5
Цитата Сообщение от activnaya Посмотреть сообщение
а где есть список всехз доступных исключений?
Выбросить можно любое значение, например:
C++
1
2
3
4
5
try {
   throw "fail";
} catch (char const* str) {
   std::cerr << str << std::endl;
}
Правда выбрасывать что-либо, не унаследованное от std::exception всё же не стоит)
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2012, 18:53     try, catch, throw #6
Цитата Сообщение от activnaya Посмотреть сообщение
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
Нет, он просто бросает исключение? Или вы об отдельно стоящем throw в блоке catch? Тогда происходит просто проброска исключения. Ловить все равно будем на более высоком уровне, например для защиты ресурсов, т. е. иммитация try - finaly
Yandex
Объявления
09.12.2012, 18:53     try, catch, throw
Ответ Создать тему
Опции темы

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