0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 23
1

Как лучше построить механизм обработки ошибок на основе исключений?

12.01.2016, 19:30. Показов 888. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня!
Я сейчас разрабатываю проект и хочу спросить: как лучше построить механизм обработки ошибок на основе исключений? Есть как минимум два варианта.

1) Создать иерархию классов исключений и выбрасывать для каждого типа ошибки свой объект одного из классов.
2) Создать один класс исключений в котором будет хранится код ошибки, сообщение и т.д., и выбрасывать исключение с соответствующим кодом ошибки.

Может быть еще что-нибудь подскажете? Или скажите какой удобней(лучше будет) будет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2016, 19:30
Ответы с готовыми решениями:

Стиль обработки исключений и логических ошибок
Допустим имеется метод void A(object B) и я точно знаю, что по логике моей программы B никогда не...

Построить класс треугольник и на его основе создать класс параллелограмм, используя механизм наследования
Построить класс треугольник и на его основе создать класс параллелограмм, используя механизм...

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

Как реализовать глобальную обработку ошибок/исключений?
Здравствуйте. На php есть возможность глобально отлавливать все исключения и ошибки, вплоть до...

4
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
12.01.2016, 20:17 2
e-loki, я бы предпочёл 2-й вариант, т.к. сам по себе код ошибки может быть полезен (код возврата приложения, например), если его можно извлечь из исключения.

Так же можно посмотреть как в стандартной библиотеке/boost::asio задизайнены error_code/error_category/system_error (я правда сам этим никогда не пользовался , так что возможно это не то, то нужно).
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.01.2016, 20:28 3
Создание своего класса исключений, наследование std::exception
1
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 23
12.01.2016, 20:50  [ТС] 4
hoggy, спасибо, способ понравился.

Добавлено через 13 минут
hoggy, а если мне нужно отследить где было выброшено исключение, как это можно сделать не подскажете?
Я вообще делал так.
C++
1
2
3
4
5
6
7
#define WHO(name) \
virtual std::string who() { return name; }
 
struct Test
{
    WHO("Test");
};
А метод с которого идет вызов получаю с __FUNCTION__.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.01.2016, 08:48 5
Цитата Сообщение от e-loki Посмотреть сообщение
а если мне нужно отследить где было выброшено исключение, как это можно сделать не подскажете?
http://rextester.com/EISL27997
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//-------------------------------------------------------------------------        
//---------- кросс-платформенный макрос отображения имени функции ---------
//-------------------------------------------------------------------------        
 
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #define dFUNCTION __PRETTY_FUNCTION__
#else
    #ifdef _MSC_VER
        #define dFUNCTION __FUNCSIG__
    #else
        #define dFUNCTION __FUNCTION__
    #endif
#endif
 
//-------------------------------------------------------------------------        
//------------ фабрика пользовательский исключений ------------------------
//-------------------------------------------------------------------------        
#include <stdexcept>
 
#define dMYEXCEPTION(exception_name)                    \
    struct exception_name: public ::std::runtime_error  \
    {                                                   \
        typedef ::std::runtime_error                    \
            Base;                                       \
        explicit exception_name(const std::string& msg) \
            : Base(msg){}                               \
        explicit exception_name(const char* msg)        \
            : Base(msg){}                               \
    }
 
#define dTHROW(type_exception, msg ) \
    throw type_exception( description(#type_exception, __FILE__, __LINE__, dFUNCTION,  msg) )
 
inline std::string 
description(const std::string& name, const std::string& file, const int line, 
            const std::string& func, const std::string& msg)
{
    return "exception: " + name 
        + "\nin file" + "(" + std::to_string(line) + "):"
        + file 
        + "\nin function: " + func
        + "\nreason: " + msg;
}
 
//-------------------------------------------------------------------------        
//-------------------------------------------------------------------------        
//-------------------------------------------------------------------------        
 
 
dMYEXCEPTION(ExampleException);
 
void foo()
{
    dTHROW(ExampleException, "test");
}
 
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    try{
        foo();
    }
    catch(const ExampleException& e)
    {
        std::cout << e.what()<<std::endl;
    }
    
}
1
13.01.2016, 08:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2016, 08:48
Помогаю со студенческими работами здесь

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

Как лучше организовать рулевой механизм робота
робот на 4 колесах, размером с две табуретки. как реализовать руление передними колесами? сделать...

Получение максимального числа для типа через механизм исключений
Вот само задание: Вычислить все простые числа, помещаемые в соответствующий тип sbyte + byte...

Необходимо не допустить ввод символьных данных, используя механизм исключений
Добрый вечер. Во время выполнения программы возникает необходимость ввести числа с клавиатуры...


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

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

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