powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения: за и против
25 сообщений из 158, страница 3 из 7
Исключения: за и против
    #34353742
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A. Fig Lee[quot Изопропил][quot Aklin]
2) f(&ret); где ret - возвращаемый код ошибки ?
сразу видно, что человек С-шник(в хорошем смысле) - предложил указатель, а не ссылку. Теперь понятна настороженность по отношению к исключениям. Не охото менять мышление?;)
...
Рейтинг: 0 / 0
Исключения: за и против
    #34353842
MasterZiv
Раскрутка стека требует значительного времени : все деструкторы надо вызвать,
ну и еще там много всего.



Деструкторы работают как обычно .
Я даже больше скажу, раскрутка стека на поля классов не влияет
что доказывает пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
#include <stdio.h>
#include <string.h>
//=============================================================

class c_exctest
{
int  s_int;
int   s_sz;
char * s_text;
char  s_stack[ 5 ];
public:
c_exctest(): s_int( 0 ), s_sz( 0 )
{
bzero(&s_stack[ 0 ],  5 );
printf("Consructor \n");
};
virtual ~ c_exctest()
{
printf("Destructor\n");
if(s_sz> 0 ) delete [] s_text;

};

virtual int  error( char* f_text)
{
s_sz=strlen(f_text);
s_text=new char[s_sz]; // Bad manner ( allocate memery here)
strcpy(s_text, f_text);

if(s_sz>= 5 ) strncpy(s_stack,f_text, 4 );
else  strcpy(s_stack,f_text);

printf("Data is [%s]\n", s_text);
printf("Stack is [%s]\n", s_stack);

printf(" Throwing Exception \n");
throw int( 255 );
return s_int;
};

virtual int go_on()
{
printf("Go on, after exception was caught \n");
printf("Data is [%s]\n", s_text);
printf("Stack is [%s]\n", s_stack);

return  0 ;
};

};


int main (void)
{
c_exctest tt;

try {
    tt.error("Some string  data  ");
    }
catch( int cc )
    {
    printf( "exceptions caught with code  %d\n" , cc );
    };

tt.go_on();

return  0 ;
};


Или я не правильно понял, то что Вы имели ввиду.

Если же исключение брошено в конструкторе , то это вообще отдельная тема ,
и принятие решения по поводу деструктора на компилятор возлагать тем более нельзя.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34353859
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, у C++ исключений есть один минус - нет стандартного механизма отлова системных ошибок (т.е. независимого от ОС).

Исключения, в основном, требовались в ситуациях, когда по-другому можно было выкрутиться только через goto...
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354071
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любитель исключений MasterZiv
Раскрутка стека требует значительного времени : все деструкторы надо вызвать,
ну и еще там много всего.

Деструкторы работают как обычно .
Я даже больше скажу, раскрутка стека на поля классов не влияет
что доказывает пример:

Совсем не понятно, что этим примером ты хочешь показать.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354102
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daevaorn A. Fig Lee[quot Изопропил][quot Aklin]
2) f(&ret); где ret - возвращаемый код ошибки ?
сразу видно, что человек С-шник(в хорошем смысле) - предложил указатель, а не ссылку. Теперь понятна настороженность по отношению к исключениям. Не охото менять мышление?;)

Надо уметь пользоваться и тем и тем.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354139
daevaorn любитель исключений MasterZiv
Раскрутка стека требует значительного времени : все деструкторы надо вызвать,
ну и еще там много всего.

Деструкторы работают как обычно .
Я даже больше скажу, раскрутка стека на поля классов не влияет
что доказывает пример:

Совсем не понятно, что этим примером ты хочешь показать.

Я хочу спросить, Где и как должен вызываться деструктор?
Может не понимаю чего?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354161
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любитель исключенийЯ хочу спросить, Где и как должен вызываться деструктор?
Может не понимаю чего?
Ааа:) Вот например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
#include <iostream>

class Foo
{
public:
	Foo()
	{
		std::cout << "Construct\n";
	}
	~Foo()
	{
		std::cout << "Destruct\n";
	}
	void bar()
	{
		std::cout << "Bar\n";
	}
};

void f()
{
	Foo foo;
	
	throw  1 ;

	foo.bar();
}

int main()
{
	try{
		f();
	}
	catch(...)
	{
		std::cout << "Catch it!" << std::endl;
	}
	return  0 ;
}
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354181
daevaorn любитель исключенийЯ хочу спросить, Где и как должен вызываться деструктор?
Может не понимаю чего?
Ааа:) Вот например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
#include <iostream>

class Foo
{
public:
	Foo()
	{
		std::cout << "Construct\n";
	}
	~Foo()
	{
		std::cout << "Destruct\n";
	}
	void bar()
	{
		std::cout << "Bar\n";
	}
};

void f()
{
	Foo foo;
	
	throw  1 ;

	foo.bar();
}

int main()
{
	try{
		f();
	}
	catch(...)
	{
		std::cout << "Catch it!" << std::endl;
	}
	return  0 ;
}



Ну так здесь он будет вызван не зависимо от того было исключение или нет.
При выходе из области видимости.
вот мой доработанный пример:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
#include <stdio.h>
#include <string.h>
//=============================================================

class c_stack
{
int s_stack;

public:
c_stack() :s_stack( 55 )
{
printf("Stack object constructor\n");
};

~c_stack()
{
printf("stack object destructor\n");
};

};

class c_exctest
{
int  s_int;
int   s_sz;
char * s_text;
char  s_stack[ 5 ];
public:
c_exctest(): s_int( 0 ), s_sz( 0 )
{
bzero(&s_stack[ 0 ],  5 );
printf("Consructor \n");
};
virtual ~ c_exctest()
{
printf("Destructor\n");
if(s_sz> 0 ) delete [] s_text;

};

virtual int  error( char* f_text)
{
c_stack st;
s_sz=strlen(f_text);
s_text=new char[s_sz]; // Bad manner ( allocate memery here)
strcpy(s_text, f_text);

if(s_sz>= 5 ) strncpy(s_stack,f_text, 4 );
else  strcpy(s_stack,f_text);

printf("Data is [%s]\n", s_text);
printf("Stack is [%s]\n", s_stack);

printf(" Throwing Exception \n");
throw int( 255 );
return s_int;
};

virtual int go_on()
{
c_stack st;
printf("Go on, after exception was caught \n");
printf("Data is [%s]\n", s_text);
printf("Stack is [%s]\n", s_stack);

return  0 ;
};

};


int main (void)
{
c_exctest tt;

try {
    tt.error("Some string  data  ");
    }
catch( int cc )
    {
    printf( "exceptions caught with code  %d\n" , cc );
    };

tt.go_on();

return  0 ;
};


Этот случай у меня сомнений не вызывал.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354194
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любитель исключений
Ну так здесь он будет вызван не зависимо от того было исключение или нет.

Ну так в этом и суть, что деструктор будет вызван в любом случае. Атоматические деструкторы плюс RAII и дают ту мощь исключениям в С++, которая делает их очень удобным и полезным инструментом. Который позволяет писать более безопасный код.
любитель исключений
При выходе из области видимости.
вот мой доработанный пример:

Всё равно не понимаю суть твоего явно переусложненного примера:)
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354241
daevaorn любитель исключений
Ну так здесь он будет вызван не зависимо от того было исключение или нет.

Ну так в этом и суть, что деструктор будет вызван в любом случае. Атоматические деструкторы плюс RAII и дают ту мощь исключениям в С++, которая делает их очень удобным и полезным инструментом. Который позволяет писать более безопасный код.
любитель исключений
При выходе из области видимости.
вот мой доработанный пример:

Всё равно не понимаю суть твоего явно переусложненного примера:)

Да сути небыло, просто было внезапно возникшее ночное желание, что то написать.

Книги, обычно, такими примерами не балуют.

Может это кому-то поможет понять как работают исключения .

А может там есть какая-то фича которую я еще не могу осознать.

Если кто знает , поделитесь, где могут еще быть подводные камни?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34354502
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh daevaorn A. Fig Lee[quot Изопропил][quot Aklin]
2) f(&ret); где ret - возвращаемый код ошибки ?
сразу видно, что человек С-шник(в хорошем смысле) - предложил указатель, а не ссылку. Теперь понятна настороженность по отношению к исключениям. Не охото менять мышление?;)

Надо уметь пользоваться и тем и тем.

+1

а пример из серии "все правильно сделал"
...
Рейтинг: 0 / 0
Исключения: за и против
    #34355919
A. Fig Lee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daevaorn A. Fig Lee[quot Изопропил][quot Aklin]
2) f(&ret); где ret - возвращаемый код ошибки ?
сразу видно, что человек С-шник(в хорошем смысле) - предложил указатель, а не ссылку. Теперь понятна настороженность по отношению к исключениям. Не охото менять мышление?;)

ето другое. Выработалась привычка писать, чтоб компилировалось все на как можно больше платформ, компайлеров и языков. Сейчас в основном - С, но фронт-енд - С++.
До етого С++ был значительно больше.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34356621
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVИсключения, в основном, требовались в ситуациях, когда по-другому можно было выкрутиться только через goto...

Откуда такие данные?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34356710
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh ErVИсключения, в основном, требовались в ситуациях, когда по-другому можно было выкрутиться только через goto...

Откуда такие данные?

Сишный аналог исключений.

man
setjmp, sigsetjmp - save stack context for non-local goto
longjmp, siglongjmp - non-local jump to a saved stack context
...
Рейтинг: 0 / 0
Исключения: за и против
    #34365018
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил еще один момент где без исключений тяжело.

Если функция должна возвращить указатель, а вернуть его не может.

Возвращать NULL, а потом его за каждым вызовом проверять, не лучший выход.

У меня при переходе на исключения количество неприятностей связанных с возвратом указателей сократилась раз в 5.

Соответственно возросла скорость отладки кода.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34365141
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Вспомнил еще один момент где без исключений тяжело.
Если функция должна возвращить указатель, а вернуть его не может.
Возвращать NULL, а потом его за каждым вызовом проверять, не лучший выход.Почему???
Что может быть проще:
Код: plaintext
1.
2.
if(! (some_pointer = some_function())) {
    cout<< "error";
}
А с исключениями ты будешь писать
Код: plaintext
1.
2.
3.
4.
5.
try {
    some_pointer = some_function();
}
catch(someexception e) {
   cout << "error";
}
Писать с исключениями больше и код обработки ошибки находится далеко от кода который может эту ошибку создать.

onstat-У меня при переходе на исключения количество неприятностей связанных с возвратом указателей сократилась раз в 5.Это неприятности не с возвратом указателей, а элементарный склероз. Если функция может упасть и это падение нельзя игнорировать, значит его нельзя игнорировать.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34365723
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl onstat-Вспомнил еще один момент где без исключений тяжело.
Если функция должна возвращить указатель, а вернуть его не может.
Возвращать NULL, а потом его за каждым вызовом проверять, не лучший выход.Почему???
Что может быть проще:
Код: plaintext
1.
2.
if(! (some_pointer = some_function())) {
    cout<< "error";
}
А с исключениями ты будешь писать
Код: plaintext
1.
2.
3.
4.
5.
try {
    some_pointer = some_function();
}
catch(someexception e) {
   cout << "error";
}
Писать с исключениями больше и код обработки ошибки находится далеко от кода который может эту ошибку создать.


Стоит упомянуть что ,
в подавляющем большенстве случаев указатель не возвращается ради указателя как такового.
Следственно
Код: plaintext
 cout<< "error"; 
нужно заменять на
Код: plaintext
 return ERR_INVALID_PTR;
Реальное принятие решения о дальнейших дествиях и обработка ошибки проиходит как
минимум на один уровень выше.
Если решение можно принять на этом уровне, то понятное дело с исключениями завязываться смысла нет.


White Owl
onstat-У меня при переходе на исключения количество неприятностей связанных с возвратом указателей сократилась раз в 5.Это неприятности не с возвратом указателей, а элементарный склероз. Если функция может упасть и это падение нельзя игнорировать, значит его нельзя игнорировать.
Конечно не без этого, люядм свойственно заблуждаться и ошибаться.
Не ошибается тот кто ничего не делает.
Я выводы из своих ошибок делаю постоянно.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34365832
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже две религии всё-таки сумели договриться?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34369170
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- пишет:

> Если функция должна возвращить указатель, а вернуть его не может.

Нет, не правильно. Это если функция возвращает ССЫЛКУ, а вернуть
она ничего не может.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34369176
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Почему???
> Что может быть проще:
>
> if(! (some_pointer = some_function())) {
> cout<< "error";
> }

Оул, ты законченный ретроград.


> А с исключениями ты будешь писать
>
> try {
> some_pointer = some_function();
> }
> catch(someexception e) {
> cout << "error";
> }

С исключениями не надо этого писать. Это надо писать
один раз в главной функции, а в этом месте вообще об
этом думать не надо. Это конечно если по семантике
some_function() должен возвращать ссылку.

> Писать с исключениями больше

Меньше, ты просто не догоняешь.

и код обработки ошибки находится далеко от
> кода который может эту ошибку создать.
Да, и это ПРАВИЛЬНО! Это - КЛЕВО!.

> Это неприятности не с возвратом указателей, а элементарный склероз. Если
> функция может упасть и это падение нельзя игнорировать, значит его
> нельзя игнорировать.

Если функция может попась в ситуацию, когда она НЕ МОЖЕТ вернуть
то, что она должна вернуть согласно своей спецификации, надо кидать
исключение. Это позволяет не писать код обработки ошибок, который
в противном случае вообще никогда не будет работать в отлаженном
и выпущенном приложении. И это правильно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34369182
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> if(! (some_pointer = some_function())) {
> cout<< "error";
> }

Кстати, ты уверен, что пользователь будет счастлив, увидев
такое на экране ? Уверен, что он вообще что-то поймет ?
Уверен, что тут надо выводить именно в консоль, а не например
вызывать MessageBox или еще что-то ?
Исключения позволяют избавиться от всех этих проблем
просто и элегантно, перенося обработку ошибок в то место,
где она может быть сделана должным образом.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Исключения: за и против
    #34370542
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Если функция может попась в ситуацию, когда она НЕ МОЖЕТ вернуть
то, что она должна вернуть согласно своей спецификации, надо кидать
исключение. Это позволяет не писать код обработки ошибок, который
в противном случае вообще никогда не будет работать в отлаженном
и выпущенном приложении. И это правильно.
Posted via ActualForum NNTP Server 1.4

Не понял, что здесь не правильно :

MasterZiv

автор

> Если функция должна возвращить указатель, а вернуть его не может.



Нет, не правильно . Это если функция возвращает ССЫЛКУ, а вернуть
она ничего не может.



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


2 selinoth: Попробуйте показать случай с обработкой невалидной ссылки или указателя
ПМ-у и посмотрите на его реакцию.
Интересно, как он предложит Вам выйти из ситуации( особенно в случае со ссылкой).
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372243
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОул, ты законченный ретроград.
Вовсе нет. Я всегда с интересом смотрю на новые принципы и если они мне нравятся начинаю использовать :)

MasterZiv> Писать с исключениями больше
Меньше, ты просто не догоняешь.

> и код обработки ошибки находится далеко от
> кода который может эту ошибку создать.
Да, и это ПРАВИЛЬНО! Это - КЛЕВО!.
Ну если это правильно и клево, покажи мне реальную задачу решеную через исключения и чтоб это решение было удобнее чем решение через коды возврата. Вот man_555 очень любит исключения, но показать такую реальную задачу не смог. Может ты сможешь?

MasterZivЕсли функция может попась в ситуацию, когда она НЕ МОЖЕТ вернуть то, что она должна вернуть согласно своей спецификации, надо кидать исключение. Это позволяет не писать код обработки ошибок, который в противном случае вообще никогда не будет работать в отлаженном и выпущенном приложении. И это правильно.Бррр.. Ну что значит "не писать код обработки ошибок"? Ты в любом случае будешь писать код обработки ошибки или код обработки исключения. В чем разница то?
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372622
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Ну если это правильно и клево, покажи мне реальную задачу решеную через исключения и чтоб это решение было удобнее чем решение через коды возврата. Вот man_555 очень любит исключения, но показать такую реальную задачу не смог. Может ты сможешь?


Как вариант:
Выход из тупиков и бесконечных циклов при обработке графов.
...
Рейтинг: 0 / 0
Исключения: за и против
    #34372635
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- пишет:
> Единственное что приходит на ум,
> если с указателем еще можно как то выкрутиться, то с невалидной ссылкой
> никак.

Это и имелось в виду.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 158, страница 3 из 7
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения: за и против
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]