Ошибки, баги, вопросы - страница 822

 

Кстати, в качестве альтернативы исключениям можно было бы реализовать при желании просто обработчик события OnError, типа так:

bool OnError(uint errorcode, string filename, uint lineno, uint colno, string context)
{
  ...
  if(critical)
  {
    return(true); // для подтверждения остановки выполнения скрипта
  }
  else
  {
    return(false); // для продолжения выполнения на чарте (текущий вызов прерывается, но следующие тики/таймеры и пр. работают)
  }
}
 
Пользуйте вcтроенную проверку кода, те же утверждения (assertions).
 
marketeer:

Кстати, в качестве альтернативы исключениям можно было бы реализовать при желании просто обработчик события OnError, типа так:

 


Думаю, что это удовлетворило меня, хоть и не полностью, т.к. понадобилось бы объявлять нужные переменные глобальными, чтобы их было видно в OnError.

Но я все-равно был бы рад этому. Нужно просто иногда выловить ошибку, после обнаружения и устранения проблемы можно было бы опять спрятать их в локальные.

Как бы донести эту мысль про OnError до Рената?

 
falkov:

Думаю, что это удовлетворило меня, хоть и не полностью, т.к. понадобилось бы объявлять нужные переменные глобальными, чтобы их было видно в OnError.

Но я все-равно был бы рад этому. Нужно просто иногда выловить ошибку, после обнаружения и устранения проблемы можно было бы опять спрятать их в локальные.

Как бы донести эту мысль про OnError до Рената?

Принципиально нет. Если программа нарвалась на критическую ошибку, то ее судьба - только на выгрузку.

У каждой важной функции есть коды возврата, все детально расписано. Поэтому разработчик не теряет контроля над своей программой.

ps: удивительно конечно даже после четкой выдачи места неправильной индексации слышать "мало даете!"

 
TheXpert:
Пользуйте вcтроенную проверку кода, те же утверждения (assertions).

Ну, тут ситуация другая. У человека происходит спорадическая ошибка (воспроизводится редко при непонятных условиях). У него и так эксперт вываливается. Если он ассерт поставит - вывалится ровно так же, но не сразу, и не будет понятно почему. Поэтому я и прошу, чтоб он код показал.

И до кучи, может быть было бы полезно, если бы такие ошибки, приводящие к остановке скрипта, сопровождались не просто указанием места, но и полным контекстом: стек вызова, содержимое переменных и т.д. Можно сделать такой вывод опциональным с помощью директивы препроцессора, т.е. указать уровень диагностики ошибок: по умолчанию оставить как есть, но чтоб была возможность уподробить.

Документация по MQL5: Основы языка / Препроцессор
Документация по MQL5: Основы языка / Препроцессор
  • www.mql5.com
Основы языка / Препроцессор - Документация по MQL5
 
marketeer:

Ну, тут ситуация другая. У человека происходит спорадическая ошибка (воспроизводится редко при непонятных условиях). У него и так эксперт вываливается. Если он ассерт поставит - вывалится ровно так же, но не сразу, и не будет понятно почему. Поэтому я и прошу, чтоб он код показал.

И до кучи, может быть было бы полезно, если бы такие ошибки, приводящие к остановке скрипта, сопровождались не просто указанием места, но и полным контекстом: стек вызова, содержимое переменных и т.д. Можно сделать такой вывод опциональным с помощью директивы препроцессора, т.е. указать уровень диагностики ошибок: по умолчанию оставить как есть, но чтоб была возможность уподробить.

Полный контекст можно отследить при дебагинге.

Другое дело что спорадические ошибки нужно отлавливать на определённых участках.

И вот тут всплывает потребность запускать дебагер на истории.

Проблема старая, много раз поднималась, но пока воз и ныне там.

 
marketeer:

Ну, тут ситуация другая. У человека происходит спорадическая ошибка (воспроизводится редко при непонятных условиях). У него и так эксперт вываливается. Если он ассерт поставит - вывалится ровно так же, но не сразу, и не будет понятно почему. Поэтому я и прошу, чтоб он код показал.

95% спорадических ошибок связаны с ошибками инициализации, либо отсутствием таковой.  Так что фрагмент кода не поможет, а весь он не даст, ибо паранойя.  ;-)

Причину следует искать очень далеко от места проявления, а афтару влом - проще потребовать расстрела для разработчиков. Это ведь наверняка поможет. 

//  Ведь правда поможет, falkov ?  :)

 
Urain:

Полный контекст можно отследить при дебагинге.

Другое дело что спорадические ошибки нужно отлавливать на определённых участках.

И вот тут всплывает потребность запускать дебагер на истории.

Проблема старая, много раз поднималась, но пока воз и ныне там.

Тоже верно.  Это бы помогло сильно, независимо от природы ошибки.
 
marketeer:

Ну, тут ситуация другая. У человека происходит спорадическая ошибка (воспроизводится редко при непонятных условиях). У него и так эксперт вываливается. Если он ассерт поставит - вывалится ровно так же, но не сразу, и не будет понятно почему. Поэтому я и прошу, чтоб он код показал.

Код нет смысла показывать, потому что там достаточно сложная логика, нафик кому надо разбираться в ней, а сам участок возникновения ошибки простой, но он ничего не дает для поиска ошибки, там функция на полэкрана чистого кода. Каждая переменная проверяется на пределы снизу и сверху. Если переменная выходит за эти пределы, то выводится сообщение с перечислением всех переменных и их значений. Конечно, где-то ошибка, но вот где!! Напомню, что это случается раз или два в неделю. Советник пашет круглосуточно.

И потом, меня интересует не только данный конкретный случай, хотя у меня это первый раз.

И до кучи, может быть было бы полезно, если бы такие ошибки, приводящие к остановке скрипта, сопровождались не просто указанием места, но и полным контекстом: стек вызова, содержимое переменных и т.д. Можно сделать такой вывод опциональным с помощью директивы препроцессора, т.е. указать уровень диагностики ошибок: по умолчанию оставить как есть, но чтоб была возможность уподробить.

А вот так было бы здорово! Полный контекст, конечно, позволил бы мне найти ошибку! Мне и нужно, чтобы в момент ошибки, перед вылетом эксперта, посмотреть на переменные.

Уважаемый Ренат! Может, можно так сделать?

 
MetaDriver:

95% спорадических ошибок связаны с ошибками инициализации, либо отсутствием таковой.  Так что фрагмент кода не поможет, а весь он не даст, ибо паранойя.  ;-)

Причину следует искать очень далеко от места проявления, а афтару влом - проще потребовать расстрела для разработчиков. Это ведь наверняка поможет. 

//  Ведь правда поможет, falkov ?  :)

Супер! Кажется, это должно помочь! :)

Инициализацию делаю тупо ВЕЗДЕ И ВСЕГДА! Даже, если через пару строк присваиваю значение переменной. Просто установил для себя железное правило - при объявлении переменной тупо ее инициализировать нулем или пустой строкой :)

Про паранойю абсолютно точно!

Метадрайвер, ты Шаман!

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5