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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка исключений, что именно проверять? 
:(
    Опции темы
ksili
Дата 19.1.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Обычно обрабатываю исключения в блоках try ... catch. Проверяю, как правило, динамическое выделение памяти, чтение/запись в файлы, обращение к массивам со сложной индексацией.

И вот возник у меня вопрос. Что ещё следует проверять на возникновение исключений, где они ещё наиболее вероятны?

Советы типа "проверять надо всё" не принимаются, поскольку, когда в блок try {...} заключён большой кусок кода, довольно-таки проблематично определить, где именно произошло исключение и как его лучше обработать.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Neitron
Дата 19.1.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нет, ответ "проверять надо все", как раз таки неправелен. Проверять нужно то и только в тех местах где эти исключения возможно могут появится.
Например, если, происходит преобразование строки в число, (в билдере, при неправильном формате, происходит исключение) то и нужно в этом месте поставить только исключение преобразования строки в число.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Mayk
Дата 19.1.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Саттер говорит, что можно забить на проверку выделения динпамятии вот по такой причине (это не из Саттера, но суть та же, и cut'n'paste'ить это легче, чем набирать кусок из книги)
Цитата(malloc(3))

BUGS
      By  default,  Linux  follows  an optimistic memory allocation strategy.
      This means that when malloc() returns non-NULL there  is  no  guarantee
      that the memory really is available.



Цитата(Neitron @ 19.1.2006, 14:30 Найти цитируемый пост)

Проверять нужно то и только в тех местах где эти исключения возможно могут появится.

+1

Это сообщение отредактировал(а) Mayk - 19.1.2006, 10:59


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Neitron
Дата 19.1.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Mayk @ 19.1.2006, 10:58)
+1

Where is? smile smile smile


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Void
Дата 19.1.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(ksili @ 19.1.2006, 12:19 Найти цитируемый пост)
когда в блок try {...} заключён большой кусок кода, довольно-таки проблематично определить, где именно произошло исключение и как его лучше обработать.

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ksili
Дата 19.1.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Проверять нужно то и только в тех местах где эти исключения возможно могут появится.

Так я об этом и спрашиваю. Что за места? Кроме преобразования строки в число пока ничего нового не услышал
Добавлено @ 12:00
Цитата

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Vyacheslav
Дата 19.1.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ksili @ 19.1.2006, 11:53)
Цитата

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

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

А как это противоречит предыдущей цитате?
Исключения, которые не идентифицируются , ловятся на самом внешнем упровне логике, где приложение знает, что с ним делать - выдать в лог "FATAL ERROR" и корректно завершить приложение smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 19.1.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Код

//здесь не ловим, все равно ничего сделать не сможем
// а диагностику выдаст самый верхний уровень
char*  func1()
{
   const size_t size = ...; 
   return new char[size];
}

//а здесь обрабатываем по месту
// потому как знаем, что делать
char*  func2()
{
   for(;;) {
    try {
      size_t size; 
      cout << "Введите размер массива:";
      cin >> size;
      return new char[size];
   } 
    catch(bad_alloc ) 
   {
       cout << "Нехватает памяти: уменьшите размер";
   }
  }
}

int main(int argc, char* argv[])
{
   //самый верхний уровень логики 
   try {
         ....
         char* buf1 = func1();
         ....
         ....
        char* buf2 = func2();
         ...
        return 0; // normal termination
    }
    catch( std::exception& exp ) {
        cout <<  exp.what() << endl
   }  
   catch( ... ) {
        cout << "Unknow error "  << exp.what();
   }  
   return 1; // fatal termination
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
blackofe
Дата 19.1.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



согласен с Vyacheslav'ом. обработку исключений надо делать из двух соображений: по возможности вокруг того места, где оно может возникнуть, и по возможности там, где можно по поводу возникшего исключения что-то сделать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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