Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

try, catch, throw - C++

07.12.2012, 03:34. Просмотров 859. Ответов 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 03:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос try, catch, throw (C++):

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

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

try-throw-catch - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; class Drob { public: int obchuslennia (int a, int...

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

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

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

5
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
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
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
07.12.2012, 05:02  [ТС] #3
а где есть список всехз доступных исключений? Какие пункты и в какой редакции стандарта?

Добавлено через 2 минуты
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
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
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
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
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2012, 18:53 #6
Цитата Сообщение от activnaya Посмотреть сообщение
я так понимаю throw это тоже что и return + печать сообщения, если оно есть ?
Нет, он просто бросает исключение? Или вы об отдельно стоящем throw в блоке catch? Тогда происходит просто проброска исключения. Ловить все равно будем на более высоком уровне, например для защиты ресурсов, т. е. иммитация try - finaly
1
09.12.2012, 18:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2012, 18:53
Привет! Вот еще темы с ответами:

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

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

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

try catch throw для чего нужны? - C++
Для чего нужны эти операторы? Линканите пожалуйста статью, где доходчиво объяснено их применение, в разных вариантах (например я видел...


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

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

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