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

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

Восстановить пароль Регистрация
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
16.07.2013, 21:00     Обработка исключений. Спецификация #1
Ниже описан код по обработке исключений. Вот какие появились вопросы:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 21:00     Обработка исключений. Спецификация
Посмотрите здесь:

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

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

Цитата Сообщение от bgm123 Посмотреть сообщение
И второе, правильно ли я понял, что спецификация функция это абсолютная ненунжная вещь?
Да. Спецификаторы бесполезны. Была одна условно полезная throw(). В C++11 её сделали чуть лучше в виде полустатического noexcept.
bgm123
39 / 39 / 16
Регистрация: 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;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 21:58     Обработка исключений. Спецификация #6
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Вообще не бросайте исключения, не наследующиеся от std::exception.
Вот тут как бы не уверен. Хорошо с одной стороны иметь общий корень иерархии, с другой стороны - это базовый класс для стандартных исключений. И, наверное, неплохо было бы их отличать от пользовательских.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.07.2013, 22:19     Обработка исключений. Спецификация #7
Цитата Сообщение от Tulosba Посмотреть сообщение
И, наверное, неплохо было бы их отличать от пользовательских.
С другой стороны, разве у пользователя не могут возникать стандартные исключения? С чего бы у него должно быть всё очень нестандартное? Разве только в STL могут возникать ошибки, выражаемые logic_error, invalid_argument или runtime_error? Со точки зрения читаемости и понятности, как мне кажется, надо как раз пользоваться или стандартными исключениями, или создавать свои на основе максимально близкого по смыслу стандартного.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.07.2013, 22:23     Обработка исключений. Спецификация #8
не важно на сколько близко что-то соответствует стандарту. тут главное что оно не соответствует на 100 процентов. отклонения от стандарта во всяких там библиотеках порождает кучу костылей в коде, который использует эти библиотеки. вам, как пользователю таких нестанртных решений врятли это понравится.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.07.2013, 22:37     Обработка исключений. Спецификация #9
Цитата Сообщение от DU Посмотреть сообщение
не важно на сколько близко что-то соответствует стандарту.
Это не тот случай. Создание своих классов исключений на основе стандартных, отражающих какие-то специализированные ситуации - нормальная и естественная практика, ничуть не костыльная. Если такие исключения используются в библиотеке и нормально документированы, то их использование не создаст проблем. А благодаря тому, что классы исключений базируются на максимально близких по смыслу стандартных, можно регулировать категории перехватываемых исключений: ловить всё на уровне std::exception, перехватывать по стандартным категориям вроде std::invalid_argument или точно отлавливать библиотечные исключения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 23:26     Обработка исключений. Спецификация
Еще ссылки по теме:

C++ Обработка исключений
Обработка исключений C++
Обработка исключений C++

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.07.2013, 23:26     Обработка исключений. Спецификация #10
или стандартными исключениями, или создавать свои на основе максимально близкого...
значит я не так понял. наследование от стандартного исключения - это стандартный ход и тут все ок.
Yandex
Объявления
16.07.2013, 23:26     Обработка исключений. Спецификация
Ответ Создать тему
Опции темы

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