Re: _ATL_NO_EXCEPTIONS conflict
On Jun 25, 10:58 am, Giovanni Dicanio
<giovanniDOTdica...@REMOVEMEgmail.com> wrote:
Forget _ATL_NO_EXCEPTIONS in MFC projects, but not in ATL projects.
ATL can work without C++ exceptions as well; and in case of
*exceptionally bad* error conditions, structure exceptions are raised,
which is just fine. Sure, this does not work if you mean exceptions as a
way to control program flow (stealing the job to 'if's :)
It's true, ultimately, one can use ATL without exceptions. I would
never do that, nor recomment that idea to a good friend ;-).
But, for example, I was thinking, if you do "raw" C++, you use e.g.
STL containers (or std::string). In "raw" C++ context, on OOM,
operator new throws bad_alloc. But on same OOM, AtlThrowImpl will
raise STATUS_NO_MEMORY (for AtlThrow(E_OUTOFMEMORY)). So you get the
worst of both worlds :-). That's why I said you need to drop most of C+
+ if you want to go exceptions-free.
By the way, for that reason, I have (had?) a pure ATL (no MFC) project
where I rig set_new_handler to throw CAtlException(E_OUTOFMEMORY).
That gives me "normal" ATL context, and STL containers are throwing
that instead of bad_alloc. Of course, doing that also means that
__any__ other (standard C++) exception going out of STL containers is
a bug, but that is, in fact easy - if they happen, there indeed is a
bug in code. So for that project, my base exception class is
CAtlException. bad_alloc became CAtlException(E_OUTOFMEMORY). I also
had a derivative that had more info in it, e.g. error text for ATL's
Error function. So all COM-boundary methods (virtually all, there's a
couple trivial prop getters) are in fact:
HRESULT Method(params)
{
try
{
workworkwork();
return S_OK;
}
catch (const CAtlException& e)
{ // Nothrow zone here.
return MyOwnErrorThatCallsATLsError(e);
}
}
It's not me who came up with this idea, I stole it from C++ Builder
(Borland tech people knew their programming, pity about the rest of
the company). There, any new COM-boundary method in ATL projects is
generated like that by the IDE.
Goran.