🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

3 total messages Started by Borneq Tue, 10 May 2016 16:14
catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
#308551
Author: Borneq
Date: Tue, 10 May 2016 16:14
28 lines
1418 bytes
Mam zdefiniowany typ

class Exception
{
public:
Exception(const char *_message = "unknown", int _n = 0) throw() {
    sth..
   }
};

rzucam wyjątek : throw new Exception("No more bytes in stream");
i okazuje się że
		catch (Exception &e)
		{
			result = EOF;
		}
nie działa, działa
		catch (...)
		{
			result = EOF;
		}
ale co ciekawe, działa
		catch (Exception *e)
		{
			result = EOF;
		}
tak bardzo nie przeszkadza, ale zwykle jest w catch co innego: 
http://www.cplusplus.com/doc/tutorial/exceptions/
Re: catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
#308552
Author: Borneq
Date: Tue, 10 May 2016 16:17
7 lines
1268 bytes
W dniu 10.05.2016 o 18:14, Borneq pisze:
> tak bardzo nie przeszkadza, ale zwykle jest w catch co innego:
> http://www.cplusplus.com/doc/tutorial/exceptions/

Ale uwaga, dlatego że wołam throw new Exception()
a mógłbym wołać throw Exception() ?
czy ta druga metoda jest lepsza? a pierwsza niekoniecznie zwalnia mi pamięć?
Re: catch nie łapie mojego typu wyjątku, tylko wskaźnik na niego
#308542
Author: keiichi
Date: Tue, 10 May 2016 17:38
26 lines
2389 bytes
W dniu 2016-05-10 o 18:17, Borneq pisze:
> W dniu 10.05.2016 o 18:14, Borneq pisze:
>> tak bardzo nie przeszkadza, ale zwykle jest w catch co innego:
>> http://www.cplusplus.com/doc/tutorial/exceptions/
>
> Ale uwaga, dlatego że wołam throw new Exception()
> a mógłbym wołać throw Exception() ?
> czy ta druga metoda jest lepsza? a pierwsza niekoniecznie zwalnia mi
> pamięć?

Tak, jest praktycznie w każdym wypadku druga jest lepsza. Zazwyczaj nie 
chcesz rzucać wyjątku przez wskaźnik. Nie wiadomo gdzie potem zwolnić 
pamięć. Kompilator sam tego nie robi i masz wycieki w podanym przykładzie.

Zazwyczaj warto łapać wyjątek przez referencję (chyba że obiekt wyjątku 
jest bardzo mały i łapanie przez wartość nie powoduje dużego narzutu).

Niektóre stare biblioteki (np. MFC) wymagały (i nadal chyba? wymagają) 
rzucania wyjątków przez wskaźnik. Prawdopodobnie ze względów 
wydajnościowych, gdy w latach chyba jeszcze 90-tych optymalizatory C++ 
były nie tak dobre jak obecnie. Aby poradzić sobie ze zwalnianiem 
przydzielanej pamięci tworzona była lista przydzielonych wyjątków i 
potem gdy program nie miał co robić, jechał po liście i zwalniał w tle 
pamięć (tak w telegraficznym skrócie). Nie chcesz tego robić samemu.

Pozdrawiam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads