2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3
 
 
Сообщение11.02.2006, 00:10 
Аватара пользователя
Да, многого я пока не знаю... :oops: Но мне пока хотелось бы иметь возможность выбора - или исключение, или возвращение ошибок. И вот еще это мне не нравится:
Цитата:
По сути своей, exception суть структурнуй переход (в неизвестный внешний уровень).

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


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

 
 
 
 
Сообщение11.02.2006, 00:24 
Аватара пользователя
:evil:
Sanyok писал(а):
И вот еще это мне не нравится:
Цитата:
По сути своей, exception суть структурнуй переход (в неизвестный внешний уровень).

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

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

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

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

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

 
 
 
 
Сообщение11.02.2006, 00:25 
Sanyok писал(а):
Цитата:
К сожалению, многие компиляторы претендуют на стандартную обработку исключений, но не во всем следуют каноническим правилам. На своем горьком опыте я узнал, что обработку исключений желательно тестировать, если вы делаете нечто хоть сколько-нибудь нестандартное (даже если оно должно быть стандартным).

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

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

 
 
 
 
Сообщение11.02.2006, 00:32 
незванный гость писал(а):
Хотя за 9 лет MS мог бы привести компилятор к стандарту...

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

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

 
 
 
 
Сообщение11.02.2006, 00:43 
Аватара пользователя
tolstopuz писал(а):
После VS2003 несоответствий практически не осталось, а сейчас уже VS2005.

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

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

 
 
 
 
Сообщение11.02.2006, 01:06 
незванный гость писал(а):
VS2005 еще не пробовал, а в VS'03 была разница между декларированным и работающим кодом...

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

 
 
 
 
Сообщение11.02.2006, 01:17 
Аватара пользователя
незванный гость писал(а):
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 
Аватара пользователя
:evil:
Очередной раз перебирал коклюшки на С++, и вспомнилась эта тема.

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

 
 
 
 
Сообщение14.03.2006, 02:15 
Аватара пользователя
VLarin писал(а):
To tolstopuz:
Цитата:
А зачем создавать объект, если он еще не нужен?

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

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

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

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

 
 
 [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group