2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 
Сообщение11.02.2006, 00:10 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Да, многого я пока не знаю... :oops: Но мне пока хотелось бы иметь возможность выбора - или исключение, или возвращение ошибок. И вот еще это мне не нравится:
Цитата:
По сути своей, exception суть структурнуй переход (в неизвестный внешний уровень).

А между местом, где произошло исключение, и где его поймали - полет через вакуум? :) И как гарантировать, что там усе нормально раскрутится? Стандарт стандартом, но мне хочется привести текст из одной книжечки (называется C++ for real programmers, автор Джефф Элджер)
Цитата:
К сожалению, многие компиляторы претендуют на стандартную обработку исключений, но не во всем следуют каноническим правилам. На своем горьком опыте я узнал, что обработку исключений желательно тестировать, если вы делаете нечто хоть сколько-нибудь нестандартное (даже если оно должно быть стандартным). Если вы окажетесь в подобной ситуации, окажите услугу всем нам:
наймите разработчика такого компилятора якобы для серьезного проекта и заставьте его писать и отлаживать код обработки исключений для его собственного компилятора в течение ближайших пяти лет. А еще лучше, заставьте его перенести в свой компилятор код, идеально работающий на другом
компиляторе.


Надеюсь, что эти советы уже устарели - книга была написана в 1998 г.

 Профиль  
                  
 
 
Сообщение11.02.2006, 00:24 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Sanyok писал(а):
И вот еще это мне не нравится:
Цитата:
По сути своей, exception суть структурнуй переход (в неизвестный внешний уровень).

А между местом, где произошло исключение, и где его поймали - полет через вакуум? :)

А как насчет неструктурного goto? Тут полет через вакуум Вас не удивляет?

Sanyok писал(а):
И как гарантировать, что там усе нормально раскрутится?

Да никак. Я как-то поймал ошибку в обработке битов Borland'ом. Ну и что теперь -- не пользоваться битами нигде? Грабли -- они и есть грабли, всюду по лесам раскиданы. Наступать на них дважды -- не след, но и в лес из-за них не ходить -- глупо. Любой инструмент надо знать, любить и холить. И компилятор в том числе. А книжечки такие писать куда легче, чем компиляторы... Я как-то уверен, что разработчик компиляторов (хороший) с задачей переноса справиться. А вот справиться ли автор с разработкой хоть плохонького компилятора С++? Не знаю, не скажу. Меня лично язык поражает своей сложностью и запутанностью.

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

 Профиль  
                  
 
 
Сообщение11.02.2006, 00:25 
Заслуженный участник


31/12/05
1406
Sanyok писал(а):
Цитата:
К сожалению, многие компиляторы претендуют на стандартную обработку исключений, но не во всем следуют каноническим правилам. На своем горьком опыте я узнал, что обработку исключений желательно тестировать, если вы делаете нечто хоть сколько-нибудь нестандартное (даже если оно должно быть стандартным).

Надеюсь, что эти советы уже устарели - книга была написана в 1998 г.

Еще бы. Когда писалась книга, у С++ не было даже стандарта. Это было время вот таких шедевров:
http://www.mozilla.org/hacking/portable-cpp.html

 Профиль  
                  
 
 
Сообщение11.02.2006, 00:32 
Заслуженный участник


31/12/05
1406
незванный гость писал(а):
Хотя за 9 лет MS мог бы привести компилятор к стандарту...

После VS2003 несоответствий практически не осталось, а сейчас уже VS2005.
незванный гость писал(а):
Я полагаю, у них другая проблема -- до хрена всего понаписано на устаревшем диалекте, и ломать эти программы ой как не хочется -- пользователи взвоют. Вот и мучаются бедняги...

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

 Профиль  
                  
 
 
Сообщение11.02.2006, 00:43 
Заслуженный участник
Аватара пользователя


17/10/05
3709
tolstopuz писал(а):
После VS2003 несоответствий практически не осталось, а сейчас уже VS2005.

VS2005 еще не пробовал, а в VS'03 была разница между декларированным и работающим кодом...

Кроме того, даже если они и отслеживают С++, то C, похоже, просто игнорируют... Были уже прецеденты, проверяли.

 Профиль  
                  
 
 
Сообщение11.02.2006, 01:06 
Заслуженный участник


31/12/05
1406
незванный гость писал(а):
VS2005 еще не пробовал, а в VS'03 была разница между декларированным и работающим кодом...

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

 Профиль  
                  
 
 
Сообщение11.02.2006, 01:17 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
незванный гость писал(а):
Sanyok писал(а):
А между местом, где произошло исключение, и где его поймали - полет через вакуум? :)

А как насчет неструктурного goto? Тут полет через вакуум Вас не удивляет?


:) Просто применение goto дело добровольное :) А в случае сбоев в конструкторе применение throw/try/catch - это скорее, дело добровольно-принудительное :) . Второе (и, наверное, главное) - довольно плохо расписано, как эти исключения ловить. Я никак не мог найти, где черным по белому написано, какое исключение вырабатывается, если мы объем памяти превысили? Только это у меня заработало:
Код:
#include <stdio.h>
#include <memory>

class aclass
{
private:
    int *ptr;
public:
    aclass(unsigned N)
    {  ptr = new int[N]; }
    ~aclass()
    {  delete [] ptr;    }
};
int main(int, char **)
{
    aclass *p;
    try
    {    p = new aclass(0xFFFFFFFF); }
    catch(std::bad_alloc)
    {    p = NULL; }
    printf(" pointer = %x \n", p);
    if(p)
        delete p;
    return 0;
}

Причем я до std::bad_alloc допер методом проб и ошибок часа через полтора! Мож и попроще есть способы, без #include <memory> и std:: , но пока у меня получилось только так. Если каждый раз так искать, какое исключение ловить - можно поседеть лет на 30 раньше, чем рассчитывал (и прожить на столько же меньше :) ).
Как узнать, какое именно исключение вырабатывается и что нужно ловить?? В Borland'е что-то выходило (там хоть сообщение вылазило, что за исключение возникло) а в консольном приложении GCC - вообще, глухо, как в танке.

исправил орфорграфию

 Профиль  
                  
 
 
Сообщение18.02.2006, 20:53 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Очередной раз перебирал коклюшки на С++, и вспомнилась эта тема.

Exceptions -- это здорово, и все внутренние объекты программы они убирают классно. Только вот состояние глобальных объектов остается плохо предсказуемым. В частности, но в очень важной частности -- состояние коммуникационных примитивов: семафоров, критических секций, mutex'ов... Во и получается, что de facto всякая атомарная операция не имеет право на необработанное исключение. Это приводит к двум практическим последствиям: первое -- любая атомарная операция становиться заметно тяжеловеснее (медленнее) за счет try - catch; и второе -- нельзя из существующей функции / метода сделать атомарный, просто заключив его в синхронизационные скобки (mutex или критическая секция).

 Профиль  
                  
 
 
Сообщение14.03.2006, 02:15 
Аватара пользователя


13/03/06
36
Урал
VLarin писал(а):
To tolstopuz:
Цитата:
А зачем создавать объект, если он еще не нужен?

Простой пример - объект CWnd, мембер другого CWnd (например CView), создается с пустыми параметрами при создании последнего, а потом, при первом обращении к объекту из CView происходит его инициализация, так как в момент создания CView хендл окна и прочая хрень не известна и несуществует в природе.

Цитата:
Для этого и придуманы исключения.

Я просто не фанат исключений, ну не нравятся они мне:))
Если можно все руками проверить, и что нужно сделать, то зачем исключения:).

:arrow: Наверно за тем, что, стандартная обработка происходит, ведь не вседа, код настолько "гладкий", что позволяет идти "другим" путём... Следовательно, каждый раз получать что-то, пусть даже на понятном языке и выполнять что-то, пусть и правильное - согласитесь не лучший вариант для нормального проекта. Наверно правильней определить класс ислючения (если стандартный не подходит), тем самым, гарантируя устойчивость алгоритма и программы, со всеми последствиями. Впрочем, если речь идет о возможности "сяшных" исключений это одно, системных вызовах - другое. всегда алгоритм должен предусматривать ситуацию выхода с "честью" и уборкой за собой всякой, извеняюсь, шняги.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group