обработка Exceptions внутри DLL советника - страница 3

 
andreybs:

Это если ошибка не связана с Access Violation. Иначе терминал падает, что неправильно.

Кстати, может у Вас есть класс, который позволяет сохранять и загружать массив элементов типа
#pragma pack(push,1)
struct RateInfo
{
unsigned int Time;
double Open;
double Low;
double High;
double Close;
double Volume;
};
#pragma pack(pop)
Можно будет один раз загрузить его из терминала и сохранить в файл, а при тестировании через консольное приложение загружать из файла
Есть, конечно.
 
andreybs:

Например, если из терминала обратиться к элементу несуществующего буфера одного из индикаторов:
Indicator->Buffer[10]->Value если Indicator->Buffer[1] вернет NULL, то сработает ошибка, которая ловится SEH
Заранее известно кол-во буферов индикатора (известно, что №10 нет). И тем не менее такое обращение возможно. Поэтому некорректные вызовы из терминала нужно обрабатывать на уровне интерфейса DLL (если внутри классов данное обращение не ловится).
К Buffer можно обратиться через метод at()
Indicator->Buffer.at(10)->Value
.
T * at(int index)
{
CheckIndex(index, m_size);
return (m_array + index);
}
.
Метод CheckIndex выглядит например так:
.
void CheckIndex(int index, int size)
{
if(index < 0)
{
throw Utils::CUtilsError(L"Index out of bounds (index < 0)");
}

if(index >= size)
{
throw Utils::CUtilsError(L"Index out of bounds (index >= size)");
}
}
.
В итоге выполняется throw, в который можно заложить-
если есть желание- подробную информацию типа
"вы обратились к массиву цен и задали индекс 15, а размер максимального элемента 12"
но это совсем необязательно.
.
А вообще, если студия зааттачена в дебаг,
то она вроде как сама показывает, где возникла ошибка.
 
jartmailru:
К Buffer можно обратиться через метод at()
Indicator->Buffer.at(10)->Value
...
В итоге выполняется throw, в который можно заложить-
если есть желание- подробную информацию типа
"вы обратились к массиву цен и задали индекс 15, а размер максимального элемента 12"
но это совсем необязательно.
.
А вообще, если студия зааттачена в дебаг,
то она вроде как сама показывает, где возникла ошибка.

Это все понятно. Так и есть - существует метод, который осуществляет проверку. В этом методе была опечатка в итоге проверка не срабатывала. Я же писал - подобные ошибки устраняются на этапе отладки... Но так или иначе, если вдруг что-то подобное случится при работе советника, терминал не должен просто упасть. Должен записаться лог ошибок. Для этого нужно использовать SEH.
 
Zhunko:
Есть, конечно.

Напоминает сцену...

- Извините, Вы не знаете, сколько время?
- Знаю.

Наверное, Вы очень гордитесь своими достижениями... :)
 

Или анекдот:

- Пятачек, прибор! 

- Двадцать.

- А что двадцать?

- А что прибор?

 
Integer:

Или анекдот:

- Пятачек, прибор!

- Двадцать.

- А что двадцать?

- А что прибор?


это был анектот про летчиков... :)))
 
andreybs:

Напоминает сцену...

- Извините, Вы не знаете, сколько время?
- Знаю.

Наверное, Вы очень гордитесь своими достижениями... :)
А у меня есть класс, который позволяет читать / писать .HST.
Внутри функции чтения что-то типа
.
std::vector<RateInfo> rates;
CFile file("data");
file.SetPointer(192);
file.Read(&rates);
.
Тока... к этому коду надо приложить 2 мегабайта исходников... Либа...
.
PS: горжусь...
 
andreybs:

это был анектот про летчиков... :)))

Точно! Это Пятачек с Крокодилом Геной летали.
 
jartmailru:
...
.
Тока... к этому коду надо приложить 2 мегабайта исходников... Либа...
.
PS: горжусь...

черт 2 МБ - это много :) да и вектора вроде работают не быстро... лан, сам напишу...
 

401 билд терминала стал самостоятельно отлавливать креши пользовательских DLL так же, как это делается в МетаТрейдер 5.

То есть, теперь падения в пользовательских DLL почти всегда не роняет сам терминал.

Причина обращения: