Re: Access Denied error on calling CFile::GetStatus() function
In the case where I'm "catching" this, the exception is not coming from MFC.
It is coming from lower than that (I can't remember exactly, but I think it
was in _timezone() or something like that. Anyway, the exception was thrown
by the OS I believe and I tried all kinds of objects and couldn't catch any
of them so I finally just gave up and did it this way. I agree that it
wouldn't be good to do this in normal practice, and it would be nice, in
fact, if they would fix CFile or )_timezone() to catch the exception useful
that I could catch, but it didn't work out that way.
Nice catch though (pun intended). I agree with you in practice and I
normally would only put this after trying to catch every other exception
that I know is possible and most of the time I would log an
UnhandledException() and close the program gently. Something like this:
try {
if(OrderManager::getInstance()->cancelOrder(&OrderDesc,true)) {
// Cancel worked OK
}
else {
// Cancel pending
}
}
// OrderException if problem with order
catch (OrderException& e) {
LogCriticalEvent(e);
// Clean up order
}
// OrderValidationException if validation problem with order
catch (OrderValidationException& e) {
LogCriticalEvent(e);
// Clean up order
}
catch (BaseException& e) {
LogCriticalEvent(e);
// Clean up order
}
catch (...) {
theApp.UnknownException();
// Send message to main window telling it something happened out of
our control
// Set flag to close down the thread
// Send message to close program
}
In the original case I figured out what is happening with the invalid date
and just replaced that date, in my program, with the current date instead.
I didn't really to quit for this and MFC never catches the exception so it
doesn't really even know about it (that I could see). I've been using this
code since around version 6 without any problems that I can see. Of course,
as I said, this only happens when I try to get status on a file that has
somehow been set with an invalid date (my test file has a date way out in
the future and it's a 'license' file for activation of a product).
Tom
"Norbert Unterberg" <nunterberg@newsgroups.nospam> wrote in message
news:O0JfuKebHHA.4000@TK2MSFTNGP02.phx.gbl...
Tom Serface schrieb:
// convert times as appropriate
try {
rStatus.m_ctime = CTime(findFileData.ftCreationTime);
}
catch(...) {
rStatus.m_ctime = CTime::GetCurrentTime();
}
Tom,
it is bad style and in this case a bug to use catch(...) like this.
Since MFC is throwing exceptions using new, the catch handler needs ro
release the memory owned by the exception, otherwise you'll get a memory
leak. The CException doc notes this: "If an exception is caught by using a
catch keyword, it is not automatically deleted."
To catch any MFC exception, use code like this:
try {
so_something();
}
catch (CException* e) {
clean_up_mess();
e->Delete();
}
Norbert