Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 17.12.2017
Сообщений: 116

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте!
В данном коде надо выполнить обработку исключительных ситуаций с использованием класса 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2019, 17:55
Ответы с готовыми решениями:

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

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

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

27
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
21.05.2019, 13:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет, не ожидает. Ожидают программисты, которые учились на си-шарп. Всегда надо делать catch(...)
Что за бред?

Во-первых, причем тут си-шарп?

Во-вторых, вы это серьёзно?
Про "ловушку параноика"?


Вот например, один бездарный дилетант написал такой код:
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
#include <iostream>
 
#include <string>
using namespace std;
struct Exception
{
    int length;
    string what() const { return "length of array is " + to_string(length); }
};
 
int main()
{
    try
    {
        throw Exception();
    }
 
    // --- ну и? 
    catch(...)
    {
        // --- и вот вы здесь
        // --- что дальше?
    }
}
Ну и что вы будете делать теперь со своим "всегда ставь три точки" ???
Как вам поможет такая ловушка?

Вы даже понять что случилось никак не сможете.
Никакой диагностики.

И в третьих, если все ж таки включить голову и подумать,
для чего по вашему в язык завезли возможность
отлавливать эксепшены по базовому классу?

Наверное, что бы этим не пользоваться, да?
И диагностику неполадки не журналировать?




Никогда не могла понять: откуда только берется такой бред в головах?

- Давай отлавливать все исключения через std::exception?

- Давай, только все не получится.
Всё равно придется ставить ловушку параноика.
И туда кроме seh будут штатные эксепшены залетать.

- ????

- Так ведь у нас в IT нынче идиотов много.
Они кидают всякий хлам, который не отнаследован от std::exception.
И потом поди, разбери всю эту сволочь.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 13:46
Цитата Сообщение от eva2326 Посмотреть сообщение
Ну и что вы будете делать теперь со своим "всегда ставь три точки" ???
Как вам поможет такая ловушка?
Вывести в лог, что неизвестная ошибка и продолжить работать. Это намного лучше, чем terminate

Добавлено через 3 минуты
вообще здесь должно быть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    try
    {
int *p =nullptr;
 
p[0] = 1; // В винде будет исключение, которое отловится
       //throw Exception();
    }
    // --- ну и? 
    catch (const Exception &e)
   {
std::cerr << e.what() << std::endl;
    }
    catch(...)
    {
std::cerr << "unknown error" << std::endl;
    }
}
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
21.05.2019, 13:48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для каждой ошибки, своя альтернатива и она должна быть заготовлена. Не зная ошибки нельзя запустить план Б.
Вы сейчас рассуждаете, как теоретик,
который ни разу не применял свою теорию на практике.

Вот почему у всех адекватных людей получается запустить план Б,
а вы не можете?

В какой ситуации запускают план Б?
План Б запускают в ситуации, когда провалился план А.

Заметьте: не важно, почему именно провалился план А.
Важно: он уже провалился, и теперь нужно что-то делать.
И именно для этого случая существует план Б.




Самолет летит в воздухе.
У него отказал двигатель.
Короткое замыкание, или птичка в турбину попала, или... ?

Здесь и сейчас не важно, почему отказал двигатель.
Важно: что теперь будем делать? Как нам выжить?

Во-первых, нужно отключить сломанный двигатель.
Что бы не дай бог ещё хуже не стало.

А во-вторых, нужно запустить аварийный двигатель.

Обратите внимание:
Вы будете выполнять одну и ту же инструкцию:
Отключать сбойный модуль, и запускать аварийный.
И это - независимо от причины аварии.

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

Поэтому, "разные ошибки" - не принципиальный фактор.
За редким исключением, одна и та же ловушка на все случаи жизни

Это так сложно для вашего понимания?

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вывести в лог, что неизвестная ошибка и продолжить работать. Это намного лучше, чем terminate
Из того факта, что три точки - лучше, чем std::terminate, вы сделали вывод,
что не нужно ожидать наследников std::exception?

Вы сами понимаете, какую ахинею несёте?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.05.2019, 14:04
Цитата Сообщение от eva2326 Посмотреть сообщение
Самолет летит в воздухе.
У него отказал двигатель.
Короткое замыкание, или птичка в турбину попала, или... ?
Здесь и сейчас не важно, почему отказал двигатель.
Важно: что теперь будем делать? Как нам выжить?
Вы не говорите такого авиаторам. Ага?
Кроме разыменования нуль-пойнтера под ms компилятором (см. пост oleg-m1973) достаточно много есть примеров того, что идиотов в IT может оказаться на 1 больше чем некто предполагает.
Что-до адресной обработки разных ошибок, то она придумана не идиотами. Хотя то, о чём вы говорите стало практикой ввиду технологичности и относительной простоте, ни кто не отменял и иное. Пусть Ваша категоричность продолжает этот беспредметный спор. Жаль, повторю - тот пост теперь доступен лишь упорным исследователям.
Там кстати полно логических ошибок. Поторопился я. Но исправить не составит труда.
Пример кода бывает разный. Я не люблю давать решение. Мне нравится показать как его можно найти. Иначе смысла не вижу. Именно по этому не стану продолжать данный разговор.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 14:43
Цитата Сообщение от eva2326 Посмотреть сообщение
Вывести в лог, что неизвестная ошибка и продолжить работать. Это намного лучше, чем terminate
Из того факта, что три точки - лучше, чем std::terminate, вы сделали вывод,
что не нужно ожидать наследников std::exception?
Нет не делал.
Я вроде бы сказал, что всегда должен присутствовать catch(...).
C++
1
2
3
catch(const std::system_error &e) {LOG_ERROR << e;}
catch(const std::exception &e) {LOG_ERROR << e;}
catch(...) {LOG_ERROR<< "unknown error";}
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
21.05.2019, 14:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы не говорите такого авиаторам. Ага?
Они и без меня это знают.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Кроме разыменования нуль-пойнтера под ms компилятором (см. пост oleg-m1973)
1.
seh под виндовс не имеет никакого отношения ни к юзерским эксепшенам,
ни к эксепшенам с++ вообще.

2.
seh (например, access violation) вы сможете отловить только в трех точках (...)

На самом деле не только в трех точках
.
Я знаю как минимум два способа.
Один из которых: проксировать seh-exceptions через эксепшены с++.
(seh отлавливается спец. ловушкой,
и перебрасывается дальше уже как обычный c++ эксепшен)
Это, безусловно, полезная возможность для разработки под windows.
Однако, это - отдельная тема, которая тянет на хорошую статью, где нибудь на Хабре.

Захотите поговорить о seh - создайте отдельную тему))



"Три точки" - это именно та ловушка,
оказавшись в которой,
даже предположить нельзя,
что именно могло случится,
и почему процесс угодил в эту ловушку.

В связи с этим ваша фраза:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не зная ошибки нельзя запустить план Б. То есть, если обрабатывать, то каждую предусмотренную ошибку индивидуально.
Выглядит особенно неадекватно.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Что-до адресной обработки разных ошибок, то она придумана не идиотами.
Вы имеете ввиду возможность обработать эксепшен конкретного типа?

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

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

И тут есть две принципиально разные категории возможных сбоев:
Например отсутствие связи по интернет, или слишком много юзеров уже подсоединились к базе.
Во всех этих случаях мы можем попытаться подключиться чуть позже.

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

Соответственно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try
{
    db::connect(sql_query);
}
catch(const InvalidSQL& e)
{
    log(e.what());
    std::terminate();
}
catch(const std::exception e)
{
    log(e.what());
    repeat_later();
}
catch(...)
{
    log("exception: unknown");    
    std::terminate();
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поторопился я. Но исправить не составит труда.
Вот теперь вы пишите правильно.
Плохо, когда человек не умеет признавать свои ошибки.
А вы - молодец.

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я вроде бы сказал, что всегда должен присутствовать catch(...).
Вы писали:
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет, не ожидает. Ожидают программисты, которые учились на си-шарп.
Вы вроде бы написали, что только программисты,
которые учились на си-шарп, ожидают,
что все нормальные эксепшены будут наследниками std::exception?

Типа, наследоваться от std::exception не нужно,
все равно ловить в трех точках будут?

Я правильно поняла этот бред?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2019, 15:26
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы вроде бы написали, что только программисты,
которые учились на си-шарп, ожидают,
что все нормальные эксепшены будут наследниками std::exception?
Типа, наследоваться от std::exception не нужно,
все равно ловить в трех точках будут?
Я правильно поняла этот бред?
Бред - это ожидать в с++, что все исключения у тебя будут унаследованы от std::exception. Это раз.
Второе - сам по себе std::exception малоинформативен, к тому же его нельзя ни к чему преобразовать (в отличие от шарпов). Поэтому будут делаться несколько catch, например для std::system_error, т.е. "будут ловить в нескольких точках"

Насчёт только программистов на си-шарп я конечно загнул, всякие скриптовики тоже думают, что достаточно отловить std::exception и всё будет в шоколаде.

Добавлено через 7 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Второе - сам по себе std::exception малоинформативен, к тому же его нельзя ни к чему преобразовать (в отличие от шарпов). Поэтому будут делаться несколько catch, например для std::system_error, т.е. "будут ловить в нескольких точках"
Забыл про dynamic_cast, беру свои слова обратно
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
21.05.2019, 15:43
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Бред - это ожидать в с++, что все исключения у тебя будут унаследованы от std::exception. Это раз.
Почему бред?
Вот почему вы считаете грамотный подход к работе бредом?

Все грамотно выполненные классы эксепшенов
в обязательном порядке отнаследованны от std::exception

Если ваш бестолковый эксепшен не отнаследован от std::exception,
то в 99% всех кейсов ваш эксепшен отловят только в этих чертовых трех точках,
где уже никто не будет знать что случилось.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Второе - сам по себе std::exception малоинформативен
Как это мало? e.what() ? Не, не слышал.

Вот именно, что знание о фактическом типе наследника как раз таки мало-информативно.
Допустим отловили вы ErrorOpenFile,
ну и что вам даст знание о типе?

Что файл не открылся?
Вы итак это знаете,
раз попали в ловушку после openFile(path);

О какой такой информативности вы сейчас вещаете?
Хотите знать детали, почему конкретно файл не смог открыться?
Может его на диске нет?
Может он другим процессом занят?
Не хватает прав?

Вы эти детали хотите знать?

Так вот специально для этого и существует волшебный e.what()

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
к тому же его нельзя ни к чему преобразовать (в отличие от шарпов).
dynamic_cast ? Не, не слышал.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <stdexcept>
 
int main()
{
    try
    {
        throw std::runtime_error("test");
    }
    catch(const std::exception& e)
    {
        const auto* converted
            = dynamic_cast<const std::runtime_error*>(&e);
        if(converted)
            std::cerr << "std::runtime_error: " << converted->what() << '\n';
    }
}
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Поэтому будут делаться несколько catch, например для std::system_error, т.е. "будут ловить в нескольких точках"
Вообще ничего не понятно.
Приведите кодом пример нескольких catch для std::system_error,
которые вы "будете ловить в нескольких точках"

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
всякие скриптовики тоже думают, что достаточно отловить std::exception и всё будет в шоколаде.
Так оно и есть в большинстве случаев.
Вы лучше попробуйте привести пример, когда "всё не в шоколаде".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2019, 15:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru