Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
1

Обработка исключений. Спецификация

16.07.2013, 21:00. Показов 926. Ответов 9
Метки нет (Все метки)

Ниже описан код по обработке исключений. Вот какие появились вопросы:
1. Есть ли при обработке исключений автоматическое преобразование типов. Ну например есть только блок catch(long int), а выбрасывается исключение catch(short int). Будет ли перехвачено это исключение?

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
#include <iostream>
using namespace std;
 
class MyClass{
    int data;
public:
    MyClass(int d):data(d){}
};
 
void OtherFunk(int a) throw(int, char)
{
    throw new MyClass(a);
}
 
int main(void)
{
    try{
        OtherFunk(5);
    }catch(int)
    {
        cout << "int" << endl;
    }
 
   return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.07.2013, 21:00
Ответы с готовыми решениями:

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

Обработка исключений
В задании функции должны генерировать подходящие исключения. Обработку исключений нужно выполнять...

Обработка исключений
Все функции должны реализоваться в 4-х вариантах: без спецификации исключений; со спецификацией...

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

9
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
16.07.2013, 21:04 2
0. Не бросайте простые типы данных. Вообще не бросайте исключения, не наследующиеся от std::exception.
1. Нет. Тип брошенного значения должен совпадать с указанным в ловилке с точностью до const/volatile спецификаторов. Плюс типы-наследники могут приводиться к типам-родителям (с точностью до ссылок).
2. Это ошибка проектирования языка. Данная функциональность практически нигде не реализована. Именно по той причине, которую вы указали. Из неё был бы толк, если бы это была статическая проверка, но она динамическая.
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
16.07.2013, 21:07  [ТС] 3
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
0. Не бросайте простые типы данных. Вообще не бросайте исключения, не наследующиеся от std::exception.
Может рассказать почему?

И второе, правильно ли я понял, что спецификация функция это абсолютная ненунжная вещь?
0
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
16.07.2013, 21:17 4
Цитата Сообщение от bgm123 Посмотреть сообщение
Может рассказать почему?
Потому что это плохой стиль. Исключения — способ сообщить об ошибке или иной исключительной ситуации. Эти ситуации бывают различных видов, поэтому очень удобно использовать систему типов языка для классификации всех возможных проблем. Но числа, строки и прочие встроенные типы не несут такой дополнительной информации. Это просто значения, а не явный дескриптор ошибки.

Цитата Сообщение от bgm123 Посмотреть сообщение
И второе, правильно ли я понял, что спецификация функция это абсолютная ненунжная вещь?
Да. Спецификаторы бесполезны. Была одна условно полезная throw(). В C++11 её сделали чуть лучше в виде полустатического noexcept.
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
16.07.2013, 21:24  [ТС] 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
class MyExcept{
    
public:
    char *buf;
    MyExcept(char *comment){
        buf = new char[strlen(comment + 1)];
        strcpy(buf, comment);
    }
 
    ~MyExcept(void) { delete []buf; }
};
 
int main(void)
{
    int a, b;
 
    try{
        cin >> a >> b;
        if(!b) throw new MyExcept("zero");
        cout << "a / b = " << a / b << endl;
    }catch(MyExcept *ob){
        cout << "error: " << ob->buf << endl;
    }
 
    return 0;
}
0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.07.2013, 21:58 6
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Вообще не бросайте исключения, не наследующиеся от std::exception.
Вот тут как бы не уверен. Хорошо с одной стороны иметь общий корень иерархии, с другой стороны - это базовый класс для стандартных исключений. И, наверное, неплохо было бы их отличать от пользовательских.
1
Эксперт С++
1669 / 1041 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
16.07.2013, 22:19 7
Цитата Сообщение от Tulosba Посмотреть сообщение
И, наверное, неплохо было бы их отличать от пользовательских.
С другой стороны, разве у пользователя не могут возникать стандартные исключения? С чего бы у него должно быть всё очень нестандартное? Разве только в STL могут возникать ошибки, выражаемые logic_error, invalid_argument или runtime_error? Со точки зрения читаемости и понятности, как мне кажется, надо как раз пользоваться или стандартными исключениями, или создавать свои на основе максимально близкого по смыслу стандартного.
0
DU
1495 / 1141 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.07.2013, 22:23 8
не важно на сколько близко что-то соответствует стандарту. тут главное что оно не соответствует на 100 процентов. отклонения от стандарта во всяких там библиотеках порождает кучу костылей в коде, который использует эти библиотеки. вам, как пользователю таких нестанртных решений врятли это понравится.
0
Эксперт С++
1669 / 1041 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
16.07.2013, 22:37 9
Цитата Сообщение от DU Посмотреть сообщение
не важно на сколько близко что-то соответствует стандарту.
Это не тот случай. Создание своих классов исключений на основе стандартных, отражающих какие-то специализированные ситуации - нормальная и естественная практика, ничуть не костыльная. Если такие исключения используются в библиотеке и нормально документированы, то их использование не создаст проблем. А благодаря тому, что классы исключений базируются на максимально близких по смыслу стандартных, можно регулировать категории перехватываемых исключений: ловить всё на уровне std::exception, перехватывать по стандартным категориям вроде std::invalid_argument или точно отлавливать библиотечные исключения.
0
DU
1495 / 1141 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.07.2013, 23:26 10
или стандартными исключениями, или создавать свои на основе максимально близкого...
значит я не так понял. наследование от стандартного исключения - это стандартный ход и тут все ок.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2013, 23:26

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

Обработка исключений
Здравствуйте, мне нужно проанализировать ведённый номер телефона методом обработка исключений....

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru