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

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

Войти
Регистрация
Восстановить пароль
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

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

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

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

Обработка исключений - C++
Необходимо создать три массива a, b и с размерами соответственно n1, n2 и n3 (n1=!n2=!n3). В массив а занести значения функции...

Обработка исключений - C++
класс B является производным от абстрактного класса А. Определить обработчик исключительной ситуации при преобразовании указателя на класс...

обработка исключений - C++
Здравствуйте. В следующем коде, при запуске throw выдает ошибку &quot;Exception object adress&quot;. Не понимаю почему. Подскажите пожалуйста. ...

Обработка исключений - C++
Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К сожалению, тему исключений мало разбирала. А...

Обработка исключений - C++
Доброго времени суток. Использую RAD XE 4. Пытаюсь поймать исключения путем catch(Exeption &amp;E) { } Но компилятор...

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

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

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

Обработка исключений - C++
Надо отловить ввод данных некорректного типа. Объясните пожалуйста на конкретном примере, как это правильно сделать. #include...

Обработка исключений - C++
Как в блоке Try...Catch... обработать необработанное исключение по адресу? Что необходимо использовать в параметрах catch?

Обработка исключений - C++
что то я не пойму а что в плюсах нельзя разве сделать что то типа: try { ... } catch (int) { ... }

Обработка исключений - C++
Добрый день! Столкнулся с такой проблемой. У меня есть класс class MyClass { public: MyClass(/* какие то параметры*/); ...


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

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

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