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

Обработка исключительных ситуаций

19.05.2019, 17:55. Показов 1675. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
В данном коде надо выполнить обработку исключительных ситуаций с использованием класса 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
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <fstream>
using namespace std;
 
class MyArray
{
    double *arr;
    int length;
public:
    MyArray(int n = 0);
    MyArray(double *a, int n);
    MyArray(const MyArray &ob);
    MyArray& operator=(const MyArray &ob);
    ~MyArray();
 
    friend ostream& operator<<(ostream &os, const MyArray &ob);
    friend istream& operator>>(istream &is, const MyArray &ob);
 
    friend ostream& operator>>(const MyArray &ob, ostream &os);
    friend istream& operator<<(const MyArray &ob, istream &is);
};
 
MyArray::MyArray(int n)
{
    if(n > 0)
    {
        length = n;
        arr = new double[length];
    }
    else
    {
        length = 0;
        arr = nullptr;
    }
}
 
 
MyArray::MyArray(double *a, int n)
{
    if(n > 0)
        length = n;
    else
        length = 0;
 
    if(length != 0)
    {
        arr = new double[length];
        for(int i = 0; i < length; ++i)
            arr[i] = a[i];
    }
}
 
MyArray::MyArray(const MyArray &ob)
{
    length = ob.length;
    arr = new double[length];
    for(int i = 0; i < length; ++i)
        arr[i] = ob.arr[i];
}
 
MyArray& MyArray::operator=(const MyArray &ob)
{
    if(this != &ob)
    {
        if(arr != nullptr)
            delete [] arr;
        length = ob.length;
        arr = new double[length];
        for(int i = 0; i < length; ++i)
            arr[i] = ob.arr[i];
    }
    return *this;
}
 
MyArray::~MyArray()
{
    if(arr != nullptr)
        delete [] arr;
}
 
ostream& operator<<(ostream &os, const MyArray &ob)
{
    for(int i = 0; i < ob.length; ++i)
        os << ob.arr[i] << ' ';
    return os;
}
 
istream& operator>>(istream &is, const MyArray &ob)
{
    is.clear();
    is.seekg(0);
    for(int i = 0; i < ob.length; ++i)
        is >> ob.arr[i];
    return is;
}
 
ostream& operator>>(const MyArray &ob, ostream &os)
{
    for(int i = 0; i < ob.length; ++i)
        os << ob.arr[i] << ' ';
    return os;
}
 
istream& operator<<(const MyArray &ob, istream &is)
{
    is.clear();
    is.seekg(0);
    for(int i = 0; i < ob.length; ++i)
        is >> ob.arr[i];
    return is;
}
 
int main()
{
 
 
    fstream f1("C:\\PROGRAMMING\\X.txt");
    fstream f2("C:\\PROGRAMMING\\Y.txt");
    MyArray ob(10);
    MyArray ob2(10);
 
 
    f1 >> ob >> ob2;
    cout << ob << endl;
    cout << ob2 << endl;
    f2 << ob << ob2;
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2019, 17:55
Ответы с готовыми решениями:

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

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

Обработка исключительных ситуаций
Код программы,Что та не робит помогите #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Обработка исключительных ситуаций
Доброго времени суток уважаемы программисты и начинающие программисты :) Скажите, почему появляется...

27
2 / 2 / 0
Регистрация: 17.12.2017
Сообщений: 116
20.05.2019, 08:51  [ТС] 2
Помогите пожалуйста
0
6143 / 3487 / 1417
Регистрация: 07.02.2019
Сообщений: 8,872
20.05.2019, 09:00 3
Rina16,
C++
1
2
3
4
5
class Exception {};
 
//...
 
if (/* что-то пошло не так */) throw Exception();
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 09:20 4
Цитата Сообщение от Rina16 Посмотреть сообщение
В данном коде надо выполнить обработку исключительных ситуаций с использованием класса 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
int main()
{
try
{
 
    fstream f1("C:\\PROGRAMMING\\X.txt");
    fstream f2("C:\\PROGRAMMING\\Y.txt");
    MyArray ob(10);
    MyArray ob2(10);
 
 
    f1 >> ob >> ob2;
    cout << ob << endl;
    cout << ob2 << endl;
    f2 << ob << ob2;
    return 0;
}
catch (const std::exception &e)
{
    std::cerr << "ERROR: " << e.what() << std::endl;
    return -1;
}
}
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 10:36 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
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
//конструкторы не могут возвращать значения и это значит, что кривые объекты будут создаваться
//если механихм исключений не используется
//по сути исключения - это выход из данной ситуации, позволяющий перехватить, исправить или
//хотя бы логировать ошибку
 
#include <iostream>
#include <string>
using namespace std;
struct Exception
{
    int length;
    string what()const{return "length of array is "+to_string(length);}
};
 
class MyArray
{
    double *arr;
    int length;
public:
    MyArray(int n = 0);
    MyArray(double *a, int n);
    MyArray(const MyArray &ob);
    MyArray& operator=(const MyArray &ob);
    ~MyArray();
 
    friend ostream& operator<<(ostream &os, const MyArray &ob);
    friend istream& operator>>(istream &is, const MyArray &ob);
 
    friend ostream& operator>>(const MyArray &ob, ostream &os);
    friend istream& operator<<(const MyArray &ob, istream &is);
};
MyArray::~MyArray(){delete []arr;}//не нужно проверок, вызов delete на 0 безопасен
 
 
MyArray::MyArray(double *a, int n=0)
    :length(n)
{
    if(length > 0)
    {
        arr = new double[length];
    }
    else
    {
        Exception ex{length};
        throw ex;
    }
 
if(a)
        for(int i = 0; i < length; ++i)
            arr[i] = a[i];
 
}
 
int main()
{
    double a[]{1,2,3};
MyArray myGoodArray(a, 10);//ok
 
try {
  MyArray myBadArray(a, -10);//this object should not be created
 
}
catch (const Exception &ex) {
cout<<ex. what();
}
 
cin.get();
return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 10:44 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
Оставил только кусочек. Это вариант с исключением в конструкторе.
Метод what() должен быть noexcept
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 11:49 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Метод what() должен быть noexcept
Как и конструктор самого класса исключения. oleg-m1973, глядя на код TC я думаю, ей сейчас нужны базовые представления. Заставлять писать кругом std:: и ещё кучу деталей (а дьявол - в мелочах, да. Но мелочи - атрибут мастерства) это сродни церковно-приходской школе, где всё внимание сконцентрировано на каллиграфии вообще и вымалёвывании заглавных литер, в частности. Я хотел лишь заострить внимание на концепции. Конструкторы не могут возвращать значений. Если бы конструктор работал как фабрика возвращая пару <bool, object>, например, то можно было бы вернуть несозданный объект. Можно бы пофантазировать над спец объектом навродь nullobj... но всё это сломало бы синтаксис. С другой стороны, прервать создание объекта без прерывания всей программы (если бы не было такого инструмента как исключение) невозможно. То есть, главное качество исключения, которое не получится красиво выразить иными средствами, это именно прерывание создание объекта и возможность обработки ситуации. Тут много логический трудностей, но тем не менее.
oleg-m1973, мне кажется, что данный момент является базовым и нужен новичку как основа концепции. Иначе, знакомство с темой будет просто курьезным эпизодом. Я встречал достаточно много людей с приличными техническими скилами, которые не понимают того о чем мы сейчас говорим.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 12:09 8
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как и конструктор самого класса исключения. oleg-m1973, глядя на код TC я думаю, ей сейчас нужны базовые представления. Заставлять писать кругом std:: и ещё кучу деталей (а дьявол - в мелочах, да. Но мелочи - атрибут мастерства) это сродни церковно-приходской школе, где всё внимание сконцентрировано на каллиграфии вообще и вымалёвывании заглавных литер, в частности. Я хотел лишь заострить внимание на концепции
Думаю, большинству новичков здесь нужны не базовые представления, а чтоб кто-то написал за них код, они его сдали и забыли весь этот с++ как страшный сон.
Для остальных же, которые действительно хотят научиться программировать, лучше прививать правильные навыки с самого начала - они берут твой код за пример.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 13:04 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Думаю, большинству новичков здесь нужны не базовые представления, а чтоб кто-то написал за них код, они его сдали и забыли весь этот с++ как страшный сон.
Я не оставался бы тут и на миг, если бы не видел, что есть новички, которым действительно интересно овладеть новым уровнем.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Для остальных же, которые действительно хотят научиться программировать, лучше прививать правильные навыки с самого начала - они берут твой код за пример.
Давайте не будем учить друг друга, что верно, а что нет. Если для хеловордного примера, потребовать стражей включения, неймспейсов для своих компонент и пр., то церковно-приходская школа будет выглядеть уже лучше. Однако, давайте каждый глядя в вопрос и его код, решит сам, что хорошо, а что плохо. Читатели получат больше точек обзора и всё в целом будет интереснее и богаче.
0
1546 / 466 / 102
Регистрация: 17.05.2015
Сообщений: 1,436
20.05.2019, 15:13 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
struct Exception
{
int length;
string what()const{return "length of array is "+to_string(length);}
};
это просто... полный...




1.
Количество элементов массива у всех здравомыслящих людей - size_t
Потому что 'количество' не может быть отрицательным.

2.
Класс исключений обязан гарантировать,
что эксепшены не полетят из самого эксепшена.

Потому что если полетят - сразу же живительная эвтаназия std::terminate

2.
Cледовательно, конструкторы/деструкторы/прочие функции-члены
обязаны быть noexcept

3.
Класс исключений должен наследоваться от 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
27
28
29
30
#include <exception>
#include <iostream>
 
int main()
{
    try
    {
        work();
    }
    catch(const ::std::exception& e)   
    {
        // --- независимо от реализации work,
        // --- мы можем отловить, 
        // --- и отреагировать на любые эксепшены,
        std::cerr << "exception(): " << e.what() << '\n';
    }
    catch(...)   
    {
        // --- а вот если мы оказались здесь, 
        // --- значит у нас все очень и очень плохо
 
        // --- мы даже не сможем вывести диагностику происшедшего
 
        // --- три точки - сигнал, что процесс в нестабильном состоянии
        // --- например, в три точки может залететь seh после access violation
        // --- здесь мы не можем знать наверняка, что именно произошло.
 
        std::cerr << "exception(): unknown\n";
    }
}
Чуть подальше от места аварии,
и уже никто не знает про тип конкретного наследника.

Если ваш эксепшен не отнаследовался от std::exception,
Считайте что он уже залетел в "три точки".

4.
На собеседованиях (или при решении тестовых заданий),
если ваш класс исключений не унаследовался от std::exception,
вас сочтут делитантом.
Миниатюры
Обработка исключительных ситуаций  
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 15:40 11
eva2326, вы недавно спрашивали о исключениях из деструктора, если я не запамятовал. Это не упрёк, а напоминание о том, что всё не знает ни кто.
eva2326, я не вижу смысла в том чтобы спорить. Вы пишете:
Цитата Сообщение от eva2326 Посмотреть сообщение
Класс исключений обязан гарантировать,
что эксепшены не полетят из самого эксепшена.
и я это отмечал:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как и конструктор самого класса исключения.
Цитата Сообщение от eva2326 Посмотреть сообщение
Количество элементов массива у всех здравомыслящих людей - size_t
Не вопрос. Однако в коде ТС - целое со знаком и затеяна проверка на неотрицательность. Я счёл это удобным для примера. Обычно говорят "пример надуман но удобен для демонстрации". Тут он был уже готов. Остальное в том же духе. Желание учить.
Наследуйте от чего хотите но
Цитата Сообщение от eva2326 Посмотреть сообщение
Класс исключений должен наследоваться от std::exception
это и есть использование примеров для тупого копирования. Догматически.
А здравомыслящий человек мог бы сказать, что наследование от std::exeption - хороший стиль и если нет настоятельной необходимости, то отклоняться от него не стоит.
Но когда человек, только знакомится с понятием, то дать концепцию в чистом виде, это может быть настоятельной необходимостью, для кого-то.
И фраза
Цитата Сообщение от Rina16 Посмотреть сообщение
В данном коде надо выполнить обработку исключительных ситуаций с использованием класса Exception.
не говорит о наследовании. Она говорит о создании кастомного типа. Тут можно спорить, конечно, но я не вижу смысла.

Добавлено через 10 минут
eva2326, это плохо, что во многих библиотеках нет исчерпывающих описаний типов исключений. Однако отлов по ссылке на базовый класс не от хорошей жизни. В идеале лучше отлавливать и обрабатывать разные ошибки по разному. Это моё имхо и спорить не собирался. Сказал лишь чтобы подчеркнуть ту категоричность с которой вы делитесь незыблемым и священным знанием.
0
1546 / 466 / 102
Регистрация: 17.05.2015
Сообщений: 1,436
20.05.2019, 18:52 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
вы недавно спрашивали о исключениях из деструктора, если я не запамятовал. Это не упрёк, а напоминание о том, что всё не знает ни кто.
Ну и что?

Цитата Сообщение от IGPIGP Посмотреть сообщение
это и есть использование примеров для тупого копирования. Догматически.
А здравомыслящий человек мог бы сказать, что наследование от std::exeption - хороший стиль и если нет настоятельной необходимости, то отклоняться от него не стоит.
Это - не "хороший стиль".
Это - производственная необходимость.

Клиентский код ожидает,
что любые возможные эксепшены - наследники std::exception.

Здесь не идет речь о "нравится"/"не нравится".
Здесь речь о "надо".

Цитата Сообщение от IGPIGP Посмотреть сообщение
не говорит о наследовании. Она говорит о создании кастомного типа. Тут можно спорить, конечно, но я не вижу смысла.
Тут не нужно спорить.
Нужно было просто привести пример как делать правильно.

Нужно что-то вроде:

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <stdexcept>
#include <iostream>
#include <fstream>
#include <string>
 
// --- что бы породить свой собственный класс исключения
// --- необходимо отнаследовать его от std::exception
 
// --- в данном случае я наследуюсь от std::runtime_error 
// --- который в свою очередь является наследником std::exception
// --- и ко всему прочему, умеет принимать в конструкторе std::string
 
// --- обратите внимания: 
// --- для создания собственного класса исключения
// --- достаточно просто унаследоваться
// --- не нужно ничего изобретать!
// --- не нужно самому писать ни конструктор, ни методы
// --- наследник нам нужен только и только,
// --- что бы его можно было отлавливать в ловушке исключений
// --- как отдельный самостоятельный тип
 
// --- говорящее название класса исключение 
// --- уже само по себе определяет суть происшествия
 
class ErrorOpenFile : public std::runtime_error
{
public:
    using runtime_error::runtime_error;
};
 
class ErrorWriteFile : public std::runtime_error
{
public:
    using runtime_error::runtime_error;
};
 
class ErrorReadFile : public std::runtime_error
{
public:
    using runtime_error::runtime_error;
};
 
void save(const std::string& path)
{
    std::ofstream out(path, std::ios::trunc);
    if(!out)
        throw ErrorOpenFile("error: can`t open: '" + path + "'");
 
    out << "test";
    if(!out)
        throw ErrorWriteFile("error: can`t write: '" + path + "'");
}
 
void load(const std::string& path)
{
    std::ifstream in(path, std::ios::in);
    if(!in)
        throw ErrorOpenFile("error: can`t open: '" + path + "'");
 
    std::string line;
    while(std::getline(in, line))
        if(in)
            std::cout << line << '\n';
        else
            throw ErrorReadFile("error: can`t load line from: '" + path + "'");
}
 
 
int main()
{
    try
    {
        const std::string path = "test.txt";
        
        save(path);
        load(path);
    }
    
    // --- сначала отлавливаем все наши исключения
    catch(const ErrorOpenFile& e)
    {
        std::cerr << e.what() << '\n';
    }
    catch(const ErrorWriteFile& e)
    {
        std::cerr << e.what() << '\n';
    }
    catch(const ErrorReadFile& e)
    {
        std::cerr << e.what() << '\n';
    }
    
    // --- затем отлавливаем нежданчики
    catch(const std::exception& e)
    {
        // --- что здесь к нам прилетело ?
        // --- может быть std::bad_alloc ?
        std::cerr << e.what() << '\n';
    }
    catch(...)
    {
        // --- если мы здесь, все плохо
        // --- не известно, что случилось, 
        // --- и почему мы здесь оказались.
        
        // --- однако известно, 
        // --- что в три точки залетает всякая гадость 
        // --- например: seh после access violation.
        
        // --- здесь у нас есть все основания полагать, 
        // --- что процесс находится в нестабильном состоянии
        std::cerr << "exception: unknown\n";
    }
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
это плохо, что во многих библиотеках нет исчерпывающих описаний типов исключений.
Почему же плохо?
На практике, конкретный тип наследника не интересен в подавляющем большинстве случаев.
Обычно, всё что нужно - это заполучить e.what()

Цитата Сообщение от IGPIGP Посмотреть сообщение
В идеале лучше отлавливать и обрабатывать разные ошибки по разному.
Вы сейчас про идеальный сферичиский мир?
Или о реальной коммерческой разработке?

В реальности, клиентский код интересуют ровно две вещи:
1. Получилось выполнить задачу?
2. Что делать если не получилось?

Ловушка сработает если не получилось.
И если не получилось, ловушка запустит план Б.

Итого: ошибки могут быть разными.
План спасения - един.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Сказал лишь чтобы подчеркнуть ту категоричность с которой вы делитесь незыблемым и священным знанием.
Вот есть такое категоричное незыблемое знание:
кидать эксепшены из деструкторов - это плохо.

А есть ещё более категоричное:
кидать эксепшен из эксепшена - категорически нельзя.

И вот эти незыблемые священные знания - это именно то,
чему новичку нужно научиться.

И не только знать, но и понимать: "почему так?"

Вот было бы у вас такое понимание,
вы бы никогда не написали такой бред:

Цитата Сообщение от IGPIGP Посмотреть сообщение
string what()const{return "length of array is "+to_string(length);}

Если бы вы унаследовались от std::exception,
компилятор бы стукнул вам по рукам.
Но вы и про этот контракт, по видимому, ни сном, ни духом.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 19:17 13
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы сейчас про идеальный сферичиский мир?
Или о реальной коммерческой разработке?
Нет. Я о живой, работающей голове, которую удалось сохранить от интеллектуального фашизма построенных рядами и колонами тупиц.
Цитата Сообщение от eva2326 Посмотреть сообщение
Почему же плохо?
На практике, конкретный тип наследника не интересен в подавляющем большинстве случаев.
Обычно, всё что нужно - это заполучить e.what()
Для человека который учится важно понять как передаётся и создаётся класс. Посмотрите какой класс у ТС. Вы собрались вещать о промразработке?
Если вопрос принципиален, я найду и книгу и страницу и номер абзаца для точного цитирования, но я помню размышления Б. Страуструпа о исключениях. Сначала он говорит о том, что POD в Си не имеют проблем, а объектный подход не поддерживается на уровне типа. То есть, у С++ сложилась ситуация, когда создание объекта нужно прервать, а таковой ранее не значилось. Исключения призваны решить эту проблему. Кроме того, этот инструмент можно использовать в любых ситуациях, но главное не увлекаться. Для примера, он приводит код в котором отлавливается исключение и непонятно как продолжить дальше (кроме останова программы, конечно). И в заключение, замечает, что создание программ с разумной обработкой исключений, это не тривиальная и трудоёмкая задача.
Разве это не интересно?
Пусть при попытке сохранения данных файл не создался/не открылся/не записался. Несколько повторных попыток не увенчались успехом. Что далее? Ясно, что альтернативные варианты (пути отхода) должны быть предусмотрены загодя. Кроме того, для возвращения в точку ветвления (альтернативного выполнения) возможно имеет смысл откатить какие-то действия. Реализация исполнительного алгоритма в паттерне "команда" - дорогое удовольствие, но вспоминая Саттера и методы защищённого программирования, можно заключить, что если нужна надёжность, то цена должна быть уплачена (и разумна разумеется).
Тут непочатый край для раздумий. И конечно, обработка исключения только ради текста о ошибке:
Цитата Сообщение от eva2326 Посмотреть сообщение
Обычно, всё что нужно - это заполучить e.what()
это примитив. Нельзя обработать ошибку не зная как её обрабатывать. Другое дело, что обработать как уже сказано, это сложно, вот и не паримся. Смотрим что случилось для отладки и всё.
Цитата Сообщение от eva2326 Посмотреть сообщение
Если бы вы унаследовались от std::exception,
компилятор бы стукнул вам по рукам.
Да полно вам. Вы с 100-го раза не в состоянии понять, что я не собирался наследовать и пишу об этом постоянно.
Более не стану. Ввиду недейственности.
0
1546 / 466 / 102
Регистрация: 17.05.2015
Сообщений: 1,436
20.05.2019, 19:49 14
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для человека который учится важно понять как передаётся и создаётся класс. Посмотрите какой класс у ТС. Вы собрались вещать о промразработке?
Почему нет?
Учиться нужно правильным вещам.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Разве это не интересно?
Интересно.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Пусть при попытке сохранения данных файл не создался/не открылся/не записался. Несколько повторных попыток не увенчались успехом. Что далее?
Зависит от задачи.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Нельзя обработать ошибку не зная как её обрабатывать.
Смотря что подразумевать под "обработкой ошибки".
На практике, ловушки не занимаются исправлением ошибки.
Они просто запускают план Б.

Например:
не удалось загрузить текстурку, тогда отпишем в лог,
и вместо текстурки используем квадратик.

Или не получилось подключиться к БД,
тогда покажем пользователю табличку,
пускай минут через 5 ещё раз попробует.

Цитата Сообщение от IGPIGP Посмотреть сообщение
это примитив.
Это - примитивный пример корректного кода.
В отличие от вашего.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы с 100-го раза не в состоянии понять, что я не собирался наследовать и пишу об этом постоянно.
Я сразу поняла, что вы просто сами не знаете, как делать правильно.

Вам человек сделал верное замечание.
А вы начали: "зачем делать по уму? им, баранам, итак сойдёт".

На самом деле вы сами просто не знаете, как это: "делать по уму".
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 21:09 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сообщение от eva2326
Класс исключений обязан гарантировать,
что эксепшены не полетят из самого эксепшена.
и я это отмечал:
Сообщение от IGPIGP
Как и конструктор самого класса исключения.
Если исключение возникнет в конструкторе, это не фатально - просто обработается не то исключение и все. Если же what() - стопудово будет terminate, потому и сказал. Это должно быть на уровне рефлексов.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
. Заставлять писать кругом std:: и ещё кучу деталей (а дьявол - в мелочах, да. Но мелочи - атрибут мастерства) это сродни церковно-приходской школе,
Учить делать using namespace std (смотрю, это массово) - вот это точно церковно-приходская школа. using namespace это, конечно, здорово, но как-то надо думать, прежде чем его использовать, и уж точно не случае std.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 21:10 16
Цитата Сообщение от eva2326 Посмотреть сообщение
Вам человек сделал верное замечание.
А вы начали: "зачем делать по уму? им, баранам, итак сойдёт".
Сожалею, что вы не только обработку ошибок но и речь как таковую воспринимаете в терминах
Цитата Сообщение от eva2326 Посмотреть сообщение
им, баранам, итак и так сойдёт
Я говорил и говорю о том, что минимально отягощённый, компилируемый пример, это то что имеет право на жизнь. Причём, заметьте что я вошёл в тему не делая замечаний. А если вам нравится думать:
Цитата Сообщение от eva2326 Посмотреть сообщение
вы сами просто не знаете
то валяйте. Я нигде не писал, что знаю как надо. Надо зависит от задачи и моих возможностей разве-что хватает на ответ в данной теме. Может быть с некоторой лихвой. Что же касается вас, - раз уж вы стали меня оценивать, то могу отметить большой отрыв между аналитикой и техническим уровнем. В частности:
Цитата Сообщение от eva2326 Посмотреть сообщение
На практике, ловушки не занимаются исправлением ошибки.
Они просто запускают план Б.
Это непросто. Для каждой ошибки, своя альтернатива и она должна быть заготовлена. Не зная ошибки нельзя запустить план Б. То есть, если обрабатывать, то каждую предусмотренную ошибку индивидуально. И лишь для непредусмотренных (мало ли что случится) можно использовать эллипсис. Вообще, попадать на три точки не нормально. Даже на три буквы не стоит. Но жаль, что текст и код рассчитанный на уровень многих посетителей раздела, теперь пошёл на многоточие.
Более не стану вам отвечать.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 21:12 17
Цитата Сообщение от eva2326 Посмотреть сообщение
Клиентский код ожидает,
что любые возможные эксепшены - наследники std::exception.
Нет, не ожидает. Ожидают программисты, которые учились на си-шарп. Всегда надо делать catch(...)
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 21:21 18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ожидают программисты, которые учились на си-шарп. Всегда надо делать catch(...)
Как раз и нет. Описание исключений для библиотек классов NET в частности очень прилично документирует исключения и примеры работы показывают каскады для разных типов исключений. эллипсис ставят в конце, но рассчитывают, что до него дело не доходит. А в студенческом коде всё может быть.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2019, 21:36 19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как раз и нет. Описание исключений для библиотек классов NET в частности очень прилично документирует
Я по факту говорю - по тому коду, который пишут программисты на с++, которые начинали учиться на с-шарп (А таких, подозреваю, сейчас большинство. Они к тому же вообще исключениям как-то не придают особого значения - авось само где-нибудь обработается).
Под линуксом ладно, там, например, обращение к нулевому указателю никаких экцепшенов вызывать не будет, сразу segfault и всё (дисциплинирует, кстати).
А вот под виндой будет исключение, и ни разу не std::exception. С одной стороны хуже - можно забить, с другой - можно обработать.
0
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.05.2019, 22:20 20
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я по факту говорю - по тому коду, который пишут программисты на с++, которые начинали учиться на с-шарп
Ну это другое дело. Начинали учиться и учились, это не одно и то же. А то я уже хотел выкатить пару примеров из msdn которые содержат аккуратные последовательности catch() для разных типов исключений. Эллипсис, возможно тоже. И блок finally конечно. Майкрософт можно ругать за многое и заслуженно. Однако культура работы с исключениями там обеспечивается вполне прилично. Другое дело, вопрос кто её использует. Новички и в Африке новички. Сегодня бизнес-потребность в "пушечном мясе" объясняет всё. Однако, это не стоит использовать во оправдание примитивизма. Особенно в ущерб пониманию. Человек вынужденный делать шару и человек который делает её естественным путём, это разные люди. Последняя реплика к вам oleg-m1973, не относится.
0
20.05.2019, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2019, 22:20
Помогаю со студенческими работами здесь

Обработка исключительных ситуаций
Здравствуйте, друзья. Подскажите, пожалуйста, как можно при помощи try-throw-catch &quot;защититься&quot; от...

Обработка исключительных ситуаций!
Составьте программу на языке С++. Обрабатывающую исключительную ситуацию, которая может возникнуть...

Обработка исключительных ситуаций.
Пожалуйста,помогите решить..В субботу экзамен,а я физически не успеваю написать 6 программок..( ...

Обработка исключительных ситуаций
Правильно ли тут я обрабатываю исключения? #pragma once #include &lt;iostream&gt; #include &quot;stdio.h&quot;...


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

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

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