Конструктор CRecordSet кидает неизвестное исключение
От: DeaD_MoroZ  
Дата: 21.04.04 07:15
Оценка:
Есть классик CDataBaseEx : public CDatabase.

У него есть функция GetDataFromTable

{
CRecordset* pRecordset = 0;

m_MainCS.Lock();

try
{
pRecordset = new CRecordset(this);
// Do SMTH
}
catch (CDBException* pDBE)
{
m_MainCS.Unlock();
// Do SMTH
}
catch (CMemoryException* pME)
{
m_MainCS.Unlock();
// Do SMTH
}
catch(CException* pE)
{
m_MainCS.Unlock();
// Do SMTH
}
catch(...)
{
m_MainCS.Unlock();
// Do SMTH
}
m_MainCS.Unlock();
}

При многопоточной работе через некоторое время в строке "pRecordset = new CRecordset(this);"
кидается исключение, которое ловится в секции "catch(...)"

После этого первый поток, который входит в критическую секцию m_MainCS
виснет в строке "pRecordset = new CRecordset(this);". Соответственно всё лочится.

Проявляется всё это исключительно в релизной версии.
Работать может всё это от 3х часов до нескольких суток..
Все таймауты на коннект и выполнение операций стоят по умолчанию 15 секунд.

Может быть кто-нибудь сталкивался с чем-то подобным?
И как можно определить тип исключения, которое можно поймать в "catch(...)"?
Re: Конструктор CRecordSet кидает неизвестное исключение
От: Pavel Dvorkin Россия  
Дата: 21.04.04 09:58
Оценка:
Привет!

DeaD_MoroZ wrote:
>
> Есть классик CDataBaseEx : public CDatabase.

<skipped>

С CDatabase не работал, поэтому только одно замечание. Поскольку это MFC
класс, то вместо __try — _catch стоит использовать MFC макросы TRY CATCH
Вот пример из исходников самой MFC

TRY
{
CWaitCursor wait;
if (pFile->GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive.Close();
ReleaseFile(pFile, FALSE);
}
CATCH_ALL(e)
{
ReleaseFile(pFile, TRUE);
DeleteContents(); // remove failed contents

TRY
{
ReportSaveLoadException(lpszPathName, e,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
}
END_TRY
DELETE_EXCEPTION(e);
return FALSE;
}
END_CATCH_ALL

Так что можешь оттуда вызвать ReportSaveLoadException, может, она тебе
что-то и расскажет...

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[2]: Конструктор CRecordSet кидает неизвестное исключение
От: DeaD_MoroZ  
Дата: 21.04.04 10:41
Оценка:
Дело в том что ReportSaveLoadException выдаёт сведения об исключении типа CException и всех его наследниках.
Если бы такое исключение было инициировано, я бы поймал его в "catch(CException*..."

Но это видимо исключение другого типа.. какого — не знаю
Re[3]: Конструктор CRecordSet кидает неизвестное исключение
От: Pavel Dvorkin Россия  
Дата: 21.04.04 11:01
Оценка:
Привет!

DeaD_MoroZ wrote:
>
> Дело в том что ReportSaveLoadException выдаёт сведения об исключении типа CException и всех его наследниках.
> Если бы такое исключение было инициировано, я бы поймал его в "catch(CException*..."
>
> Но это видимо исключение другого типа.. какого — не знаю

А если все это под __try — __except поставить и (если оно там поймается)
GetExceptionCode ? Хоть на этом уровне...

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.