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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка исключительной ситуации, try, catch, throw 
V
    Опции темы
stat007
Дата 20.3.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Помогите разобраться с работой исключительных ситуаций. 
К примеру есть такая задача: Вводится массив чисел с клавиатуры, исключительная ситуация должна обработать действие ввода числа 0, и потом вывести все значения пропуская введённые нули!
Код

#include<iostream>
#include<iterator>
using namespace std;
int main()
{
    int m[10],x,n=0;
    
    try{
    while(cin>>x, x!=0 && n<10)
        m[n++]=x;
    }
    catch(int i)
    {    
        i==0;
        continue;
    }
    throw
    {
        copy(m,m+n,ostream_iterator<int>(cout, " "));
    }

    system("pause");
    return 0;
}

Попытался написать код, но понимаю что не так! Подскажите как правильно нужно сделать???
PM MAIL   Вверх
zim22
Дата 20.3.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(stat007 @  20.3.2010,  19:11 Найти цитируемый пост)
Попытался написать код, но понимаю что не так!

шедевр...
Код

throw    {
        copy(m,m+n,ostream_iterator<int>(cout, " "));    
}

совет: почитай книжечку. в любом учебнике по С++ примеров завались.



--------------------
PM MAIL   Вверх
stat007
Дата 20.3.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спс за совет, но не в одной книжке я не нашёл хорошего примера по данной теме! smile 

Это сообщение отредактировал(а) stat007 - 20.3.2010, 20:41
PM MAIL   Вверх
zim22
Дата 20.3.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

// 306.cpp : Defines the entry point for the console application.
//

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

void CheckDivisionByZero(int number) {
  if (number == 0)
    throw std::runtime_error("division by zero");
}
int _tmain(int argc, _TCHAR* argv[])
{
  int number = 0;
  std::cin >> number;

  try {
  CheckDivisionByZero(number);
  } catch (std::exception &ex) {
    std::cout << ex.what() << std::endl;
    return 1;
  }
  return 0;
}



--------------------
PM MAIL   Вверх
ForceKeeper
Дата 20.3.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В try-блок ты помещаешь код, в котором может возникнуть ошибка. Если такая возникает, то нужно выбросить ошибку с ее типом (инт, дабл или любой другой *включая свои*).
Код

throw int ();

Обрати внимание, что в таком случае после типа должны идти круглые скобки.
Сразу за трай-блоком должны идти catch-блоки, каждый из которых отлавливает определенный тип ошибки (инт, дабл и т.д.), есть еще вариант кэтча, который ловит ошибки любого типа. Также можно выкидывать не просто тип ошибки, а уже какую-то переменную. В таком случае наша ошибка будет характеризоваться не только типом переменной, но и ее значением, которое сможет получить кэтч-блок. Внутри же кэтча ты пишешь код, обрабатывающий ошибку.

Вот тебе пример. Программа просит ввести число, если оно оказалось от нуля до единицы, то мы кидаем ошибку с данной переменной. Ее хватает кэтч, ловящий инты, принимает значение переменной и использует его в выводе на экран, что юзер такой нехороший ввел число от 0 до 10. Если же ввод числа был корректным (меньше нуля или больше 10), то программа проскакивает кэтч и рапортует о том, что число не попало в интервал от 0 до 10.  

Код

#include <iostream>
#include <locale.h>

using namespace std;

int main ()
{
    setlocale (LC_ALL, ".1251");
    int a;
    cout << "Введите число\n";
    try
    {
        cin >> a;
        if (a >= 0 && a <= 10)
            throw a;
    }
    catch (int b)
    {
        cout << "Вы ввели число от нуля до 10, а именно " << b << endl;
        system ("pause");
        return 0;
    }
    cout << "Вы ввели число вне интервала от 0 до 10\n";
    system ("pause");
    return 0;
}

PM MAIL WWW   Вверх
stat007
Дата 21.3.2010, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ForceKeeper, 
спасибо большое благодаря твоему примеру я понял что это такое и как с ней работать! smile 
PM MAIL   Вверх
bsa
Дата 22.3.2010, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



stat007, только имей в виду, что для исключений есть специальный стандартный интерфейс (абстрактный класс) std::exception (#include <exception>), а так же ряд готовых "ошибок", например, std::runtime_error (#include <stdexcept>).
PM   Вверх
azesmcar
Дата 22.3.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(bsa @  22.3.2010,  00:38 Найти цитируемый пост)
есть специальный стандартный интерфейс (абстрактный класс) std::exception 

вообще-то он не абстрактный smile 
PM   Вверх
Леопольд
Дата 22.3.2010, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  22.3.2010,  08:40 Найти цитируемый пост)
вообще-то он не абстрактный 
А, по уму, должен бы быть абстрактным... smile



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 22.3.2010, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Леопольд @  22.3.2010,  08:47 Найти цитируемый пост)
А, по уму, должен бы быть абстрактным... smile

а по стандарту нет
PM   Вверх
bsa
Дата 22.3.2010, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(azesmcar @  22.3.2010,  08:48 Найти цитируемый пост)
а по стандарту нет 
Действительно, по стандарту не абстрактный.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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