Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с исключениями! 
:(
    Опции темы
rainbow86
Дата 18.12.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



В 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!!!
PM MAIL   Вверх
Anikmar
Дата 18.12.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



А что еще программа по этой строчке должна делать?! Там же прямо сказано ВЫЛЕТЕТЬ...
PM MAIL ICQ   Вверх
rainbow86
Дата 18.12.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Мож я конечно чего то не понимаю  smile  но по моему исключения и были придуманы для того что б избежать ВЫЛЕТА???
PM MAIL   Вверх
JackYF
Дата 18.12.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


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

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


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

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
witex
Дата 18.12.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



У тебя класс работает? или пишет ошибку при компиляции?или при работе уже с прогой?
Если во время работы, то просто параметр передай не 0, он обрабатывает ошибку деления! деления на 0!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Anikmar
Дата 18.12.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

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

Цитата

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


А как назовем оператор flyin?
PM MAIL ICQ   Вверх
witex
Дата 18.12.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



ну дык, правильно делай исключение, а не вылет.
try/catch и вперёд!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
JackYF
Дата 18.12.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Хм... надо подумать smile

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
rainbow86
Дата 18.12.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



В том то и дело что исключение обробатывается вот код:

Код

#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) 

Всем спасибо!
PM MAIL   Вверх
Любитель
Дата 18.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 18.12.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



fly_to_ass  smile 
PM MAIL ICQ   Вверх
Daevaorn
Дата 18.12.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



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

Никогда так не делай! Это тебе не Java:)
PM MAIL WWW   Вверх
Oleg_Ci
Дата 18.12.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



интересно, ведь здесь память выделяется
Код

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 

Это сообщение отредактировал(а) Олег4 - 18.12.2006, 20:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0904 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.