artbear писал(а) 08. Мая 2008 :: 09:50:Alex_Spb писал(а) 08. Мая 2008 :: 07:37:И для чего нужна эта прослойка в виде
CBLModuleWrapper ?
Этот класс обеспечивает
1) удобный показ ошибок для вложенных классов, вызовов и т.д.
2) работу с исключениями для подобных классов
3) работу с отладчиком
4) позволяет из модуля класса получить контекст класса - например, некоторые методы 1С возвращают не контекст, а только модуль контекста.
Спасибо.
А каким образом удалось заставить работать отладчик в 1С++ ?
Я посмотрел в rainbow отладчик вылетает после
вызова execute
case methExecute:
rValue = pBLModule->Execute();
break;
где
class CBLModule * pBLModule;
в 1С++ execute() в CExecuteModule
выглядит так
case methExecute:
// artbear
// rValue = pBLModule->Execute();
// break;
{
if (!m_bEnableThrow)
rValue = pBLModule->Execute();
else
try{
rValue = pBLModule->Execute();
}
catch(CString &err)
{
RuntimeError(err);
//rValue = CValue(long(0));
return 1;
}
catch(...)
{
RuntimeError("Неизвестная ошибка", 0);
//rValue = CValue(long(0));
return 1;
}
break;
}
где
class CBLModuleWrapper* pBLModule;
На мой взгляд вызовы абсолютно одинаковые, но в одном случае отладчик работает в другом нет.
Кстати, Артур ты планируешь в ближайшее время заниматься проблемой
с
ВыполняемыйМодуль которую я описал
в
http://www.1cpp.ru/bugs/show_bug.cgi?id=3802 ?
Мне кажется это серьёзный баг без исправления, кторого использовать ВыполняемыйМодуль,
практически невозможно , потому при активном использовании ВМ и сложных взаимосвязях между ними
понять что происходит при том , что ВМ молчит при возникновении ошибок
невозможно.
Я посмотрел, что
int i = pBLModule->CallAsFunc(iMethNum - lastMethod,rValue,j,ppValue);при ошибке должно быть равно 0, если всё нормально то не 0.
Может тогда хотя бы поставить какую то проверку:
если получили 0 тогда
- сообщить что была ошибка при выполнении такого то модуля (не знаю возможно ли получить имя перемееной которой присвоен модуль),
- и перекомпилить и выполнить текст данного модуля.