Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с исключениями!


Автор: rainbow86 18.12.2006, 15:18
В MSDN нашел пример построения статической библиотеки вотс таким вот кодом:

Код

// MathFuncsLib.cpp
// compile with: /c /EHsc

#include "MathFuncsLib.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b)
    {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b)
    {
        if (b == 0)
        {
            throw new invalid_argument("b cannot be zero!");
        }

        return a / b;
    }
}


При использовании этого класса, программа вылетатет на строчке
Код

 throw new invalid_argument("b cannot be zero!");



Какая здесь может быть ошибка???  smile 
Код в точности повторяет код из msdn!!!

Автор: Anikmar 18.12.2006, 15:24
А что еще программа по этой строчке должна делать?! Там же прямо сказано ВЫЛЕТЕТЬ...

Автор: rainbow86 18.12.2006, 15:46
Мож я конечно чего то не понимаю  smile  но по моему исключения и были придуманы для того что б избежать ВЫЛЕТА???

Автор: JackYF 18.12.2006, 15:47
Цитата(Anikmar @  18.12.2006,  15:24 Найти цитируемый пост)
Там же прямо сказано ВЫЛЕТЕТЬ... 


Молодец! Классно написал!

А может добавим в стандарт оператор flyout - вылететь нафиг? smile


По существу, в этой строчке выбрасывается исключение. Так вот, если клиентский код его не обработал ( блоком try-catch ), то программа вылетит.
Так что все верно.

Если же сделать обработку, то программа будет работать/хромать и дальше.

Автор: witex 18.12.2006, 15:49
У тебя класс работает? или пишет ошибку при компиляции?или при работе уже с прогой?
Если во время работы, то просто параметр передай не 0, он обрабатывает ошибку деления! деления на 0!

Автор: Anikmar 18.12.2006, 15:49
Цитата(JackYF @ 18.12.2006,  15:47)
Молодец! Классно написал!

Ладно придираться  smile 

Цитата

А может добавим в стандарт оператор flyout - вылететь нафиг? smile


А как назовем оператор flyin?

Автор: witex 18.12.2006, 15:58
ну дык, правильно делай исключение, а не вылет.
try/catch и вперёд!

Автор: JackYF 18.12.2006, 16:00
Хм... надо подумать smile

Ну что, делаем опрос?

Автор: rainbow86 18.12.2006, 16:07
В том то и дело что исключение обробатывается вот код:

Код

#include "stdafx.h"
#include "MathFuncs.h"
#include <iostream>
#include <stdexcept>

int _tmain(int argc, _TCHAR* argv[])
{
    double a = 0.0;
    double b = 0.0;
    std::cin >> a;
    std::cin >> b;
    std::cout << "a + b = " <<
        MathFuncs::MyMathFuncs::Add(a, b) << std::endl;
    std::cout << "a - b = " <<
                  MathFuncs::MyMathFuncs::Subtract(a, b) << std::endl;
    std::cout << "a * b = " <<
                  MathFuncs::MyMathFuncs::Multiply(a, b) << std::endl;
    try
    {
        std::cout << "a / b = " <<
            MathFuncs::MyMathFuncs::Divide(a, b) << std::endl;
    }
    catch(std::invalid_argument b)
    {
        std::cout << b.what();
    }
    std::cin >> b;
    return 0;
}


Все проблему решил, незаметил ошибку:
вместо 
catch(std::invalid_argument b) 
надо было
catch(std::invalid_argument *b) 

Всем спасибо!

Автор: Любитель 18.12.2006, 16:28
JackYF, ИМХО оператор не надо. Можно добавить функция в рантайм (что называется Language support runtime library): std::fly_to_fig. Не знаю, как лучше по аглички назвать. Можно также для винды std::make_blue_screen.

Опрос, конечно, надо устроить. Резултьтат отошлём комитету для следующего стандарта плюсов (в C++09 это уже не успеет войти).

Добавлено @ 16:33 
Э-э, не гуд исключение на хипе создавать. Надо привыкать юзать стек и ссылки. Во-первых, кто его удалять должен (только не говорите, что рантайм - это не так)? Во-вторых, интересно, как std::bad_alloc вы выбрасывать будете (мож собственные аллокаторы пишете).

Автор: Anikmar 18.12.2006, 16:40
fly_to_ass  smile 

Автор: Daevaorn 18.12.2006, 19:44
Цитата(rainbow86 @  18.12.2006,  16:18 Найти цитируемый пост)
 throw new invalid_argument("b cannot be zero!");

Никогда так не делай! Это тебе не Java:)

Автор: Oleg_Ci 18.12.2006, 20:14
интересно, ведь здесь память выделяется
Код

throw new invalid_argument("b cannot be zero!");
значит её в блоке catch(std::invalid_argument *b) удалять надо, или кто-то её как-то удаляет ?
Код

catch(std::invalid_argument * b)
    {
        std::cout << b->what();
        delete b; // <<<<<<<  ?
    }



блин, меня Daevaorn опередил smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)