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

 
falkov:

да указывается, конечно, и что с того. Я это место и обложил разными проверками.

Место мне известно, мне не понятно, почему это происходит!

Проверяю и размер массива перед этой строчкой и другие переменные на выход за границы.

А все равно пару раз в неделю эксперт вываливается.

Скорее всего, это моя ошибка, я и не против этого. Я против того, что у меня нет никаких механизмов выяснить, где собака порылась.

В то-же время есть простой и удобный механизм исключений. Они и были как-раз введены для подобных случаев.

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

Какой-то несуразный аргумент, на мой взгляд.

Ну, позиция МетаКвотов по поводу исключений известна и бесповоротна (я сам с ними дискутировал по этому поводу 2 года назад), так что нужно обходиться тем, что есть. Было бы больше пользы, если бы часть вашего исходника была показана.
 

Кстати, в качестве альтернативы исключениям можно было бы реализовать при желании просто обработчик события 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:

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

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

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

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

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

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

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