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

не перехватывается исключение, хоть по книге c++ за 21 день и должно

09.03.2019, 19:10. Показов 411. Ответов 6
Метки нет (Все метки)

C++ (Qt)
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
#include <exception>
#include <iostream>
#include <string>
using namespace std;
 
class CustomException : public std::exception
{
    string Reason;
public:
    // constructor, needs reason
    CustomException(const char* why) :Reason(why) {}
 
    // redefining virtual function to return 'Reason'
    virtual const char* what() const throw()
    {
        throw 10;
        return Reason.c_str();
    }
};
 
double Divide(double Dividend, double Divisor)
{
    if (Divisor == 0)
        throw CustomException("CustomException: Dividing by 0 is a crime");
 
    return (Dividend / Divisor);
}
 
int main()
{
    cout << "Enter dividend: ";
    double Dividend = 0;
    cin >> Dividend;
    cout << "Enter divisor: ";
    double Divisor = 0;
    cin >> Divisor;
    try
    {
        cout << "Result of division is: " << Divide(Dividend, Divisor);
    }
    catch (exception& exp)// catch CustomException, bad_alloc, etc
    {
        cout << exp.what() << endl;
        cout << "Sorry, can't continue!" << endl;
    }
 
    return 0;
}
Миниатюры
не перехватывается исключение, хоть по книге c++ за 21 день и должно   не перехватывается исключение, хоть по книге c++ за 21 день и должно  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2019, 19:10
Ответы с готовыми решениями:

Почему не перехватывается исключение типа double?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstring&gt; using namespace std; void obrob(int...

Почему в async void методе не перехватывается исключение?
Привет! В ряде статей читал о том, что в подобном случае исключение не перехватывается и...

Не открывается программа, хоть все должно быть идеально
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; bool gameOver; const int width =...

Найдите ошибку, должно высчитывать сумму столбца, где есть хоть 1 отрицательный элемент
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

6
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
09.03.2019, 19:13 2
Деление целых чисел на ноль не является исключением в стандартном С++.
Поэтому нужно самому писать исключение

Пример (взят с другого форума. Но вроде верно)

C++
1
2
3
4
5
6
7
8
try
{
    if (c==0) throw std::exception("Деление на 0");
    a = b/c;
} catch(std::exception&e)
{
    cout << e.what();
}
0
0 / 0 / 0
Регистрация: 01.02.2019
Сообщений: 36
09.03.2019, 19:22  [ТС] 3
C++ (Qt)
1
2
3
4
5
6
int main()
{
    cout << "Enter dividend: "<<6/0;
    
    return 0;
}
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2124 деление на ноль или остаток от деления на ноль ConsoleApplication1 c:\project2017\consoleapplication1\consoleapplicat ion1\consoleapplication1.cpp 10
0
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
09.03.2019, 19:26 4
В вашем коде замените свои строчки на эти
C++
1
2
3
4
5
try
    {
        if (Divisor == 0) throw std::exception("division on 0");
        cout << "Result of division is: " << Divide(Dividend, Divisor);
    }
Тут явное деление на нуль. Компилятор не допустит
C++
1
2
3
4
5
int main()
{
    cout << "Enter dividend: "<<6/0;
    return 0;
}
А если так ..
C++
1
2
3
4
5
6
int main()
{
    int b=0;
    cout << "Enter dividend: "<<6/b;
    return 0;
}
0
892 / 350 / 79
Регистрация: 17.05.2015
Сообщений: 1,152
09.03.2019, 21:33 5
Цитата Сообщение от john_connorT100 Посмотреть сообщение
* * virtual const char* what() const throw()
* * {
* * * * throw 10;
Здесь вы кидаете эксепшен из функции, из которой кидать нельзя.
Обратите внимание на спецификатор throw().
Он означает, что функция никогда не выбросит исключение.
За этим обязан проследить программист, который этот самый спецификатор написал.

Нарушение данного контракта - UB.
0
Don't worry, be happy
17758 / 10526 / 2030
Регистрация: 27.09.2012
Сообщений: 26,502
Записей в блоге: 1
09.03.2019, 21:42 6
Цитата Сообщение от eva2326 Посмотреть сообщение
Нарушение данного контракта - UB.
Не UB же. Нарушение приведет к вызову std::terminate, либо к вызову std::unexpected для dynamic exception specification.
1
892 / 350 / 79
Регистрация: 17.05.2015
Сообщений: 1,152
09.03.2019, 22:15 7
Действительно.
Если выбросить исключение из функции, помеченной как noexcept (или throw() ),
тогда сработает std::terminate

Можно пофиксить вызов std::terminate

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
#include <exception>
#include <iostream>
#include <string>
using namespace std;
 
class CustomException : public std::exception
{
    string Reason;
public:
    // constructor, needs reason
    CustomException(const char* why) :Reason(why) {}
 
    // redefining virtual function to return 'Reason'
    virtual const char* what() const throw()
    {
        throw 10;
        return Reason.c_str();
    }
};
 
double Divide(double Dividend, double Divisor)
{
    if (Divisor == 0)
        throw CustomException("CustomException: Dividing by 0 is a crime");
 
    return (Dividend / Divisor);
}
 
int main()
{
    const auto terminate_handler = []{
        std::cerr << "terminate handler called\n";
        abort();  // forces abnormal termination
    };
 
    std::set_terminate(terminate_handler);
 
    cout << "Enter dividend: ";
    double Dividend = 0;
    cin >> Dividend;
    cout << "Enter divisor: ";
    double Divisor = 0;
    cin >> Divisor;
    try
    {
        cout << "Result of division is: " << Divide(Dividend, Divisor);
    }
    catch (exception& exp)// catch CustomException, bad_alloc, etc
    {
        cout << exp.what() << endl;
        cout << "Sorry, can't continue!" << endl;
    }
 
    return 0;
}

terminate handler called
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2019, 22:15
Помогаю со студенческими работами здесь

Определить минимальное количество листов, которое должно быть в книге, чтобы редкие ингредиенты не пострадали
1935. Слёзы утопленников Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ Гадалка Тиа...

Как сделать исключение, при вводе цифры в строку должно выдавать ошибку
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Медленно работает ПК, хоть браузер, хоть Проводник. Может вирус?
Собственно все в заголовке темы

Не видно никогда что работают хоть 3 ядра i5 хоть на 50%
привет. Есть ssh под Ubuntu 10.04-32 не могу распределить нагрузку и увидеть что работают хоть 3...

Не работают клавиатура и мышь, хоть PS/2, хоть USB
Не работают клавиатура и мышь, хоть PS/2, хоть USB. Загрузился в LiveDVD TechAdmin WinPE 5.0, и...

Стоит ли изучать C++ по книге "C++ за 21 день"?
Приветствую всех! Положили меня в больницу, привезла супруга ноут...а нука, постовлю как я Linux,...


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

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

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