15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Exception handler

Tsvilikhovskiy_Jake/ny_mis@npd.com
Monday, May 20, 1996

Env: Win3.11 VC++ 1.51

Hi ppl!
My application(16 bit W3.11 medium memory model)
uses a lot of memory allocation. 
There is a good chance of running out of memory.

I want to write a exception handler as I 
TRY{
new something
CATCH(CMemoryException,e)
{
fExeptionHandler() // is supposed to to give an error message, free //
whatever is allocated and terminate the application
} 
END_CATCH

This can happen in a lot of places in my program.
many different things can be allocated at this undefined point
of execution.

The question : 
Where can I find info how to write such a handler?

As I underdstand I will need some kind of garbage collector
for that...

Any help is greatly appreciated

Jake




Dan L. Pierson -- dan@cthulhu.control.com
Wednesday, May 22, 1996

[Mini-digest: 3 responses]

You have four main choices:

1. Switch to a 32-bit version of VC++ which really implements exception handling.

2. Switch to a competitive 16-bit C++ compiler which supports both exception handling
    and MFC, E.G. Symantec C++ 7.x.  In this case you may need to use 'try', instead of "TRY", etc.
    I don't know if this will break the 16-bit MFC.

3. Buy a third party garbage collector such as Great Circle from Geodesic Systems.  (I don't know if
    1.0 supports 16-bit VC++/MFC, but the current beta 2.0 claims to do so.  BTW: I'm in early eval
    stages with this, so can't be much help yet).

4. Give up on exception handling until you can do one of the above.  The MFC 2.x macros that try
    to look like exception handling are a far cry from the real thing.  While I can understand the MFC
    group wanting to use such a kludge internally, IMHO documenting them was a mistake.  They
    tend to fool unsuspecting customers into thinking they have something they don't...

-----From: "Frederic Steppe" 

You said you want to terminate the application if the memory becomes too low. 
Do it this way (a little bit radical) :

TRY
{
	new something;	// You may allocate more than one block in one try, but you 
will not know which one has failed
	new otherthing;
}
CATCH(CMemoryException,e)
{
	fExceptionHandler(e);
} 
END_CATCH

void fExceptionHandler(CException *e)
{
	// Do whatever you want, but don't allocate anything !

	AfxAbort();	// If you can't recover from the error, just exit
}


You better try to recover and exit the function, but not the application :

BOOL bInitOK = TRUE;

TRY
{
	new something;
}
CATCH(CMemoryException,e)
{
	free WhatWasAllocatedAndCanBeFreed;
	fExceptionHandler(e, FALSE);
	bInitOK = FALSE;
} 
END_CATCH

void fExceptionHandler(CException *e, BOOL bFatal)
{
	// Do whatever you want, but don't allocate anything !

	if(bFatal)
		AfxAbort();	// If you can't recover from the error, just exit
	else
		::MessageBox(NULL,"Insufficient memory to complete this operation.\nPlease 
close one or more applications and try again.","Low Memory",MB_ICONSTOP | 
MB_OK | MB_SYSTEMMODAL);
}


Frederic Steppe (frederics@msn.com)
-----From: "Julius Hamelberg" 

     Check out this site:
     EXCEPTION HANDLING:
     A FALSE SENSE OF SECURITY
     
     http://www.aw.com/cp/mec++-cargill.html
     
     I found it very interesting.
     Hope this helps.
     
     Julius
     




| Вернуться в корень Архива |