Почему в MQL5 нет исключений? - страница 13

 
Учитывая узкую специализацию языка, исключения не особо и нужны. Просто делайте больше проверок.
 
Alexey Volchanskiy:

Это ясно, этого пока нет. 

Я о настоящем - писали, что делаете это с 2011 года, вроде вы писали, лень искать. Так как?

1) По текущей ситуации наверное пока так стоит все сделать, просто других вариантов я лично не вижу

а) Добавить REASON_ERROR как причину деинициализации робота по фатальной ошибке в коде

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

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

 2) Не совсем понимаю позицию Рената по поводу OnError. Скажем если если по поводу исключений я позицию еще понять могу (действительно огромная толпа горе-программеров все будет "маскировать" и "прятать"), а вот чем плохо использовать OnError на уровне торгового робота, скрипта или класса не очень понятно.

 
Renat Fatkhullin:
Вышесказанное никакого отношения к эксепшенам не имеет.

Как раз багрепорты(падаем с отчетом, а не игнорируем/скрываем) дают возможность исправлять ошибки. А предлагаемые публикой эксепшены в подавляющем большинстве случаев использовались бы для маскировки ошибок.

Да, с точки зрения маркета это разумно, но лично для себя я все же предпочел иметь эксепшены, а критические ошибки я бы протоколировал в логи в секции catch{}.

Небольшая история о критических ошибках из жизни

Я в 2000-2005 гг. отвечал, в том числе,  за связь Диспетчерская - тяговая подстанция на ж/д. Мы тогда переводили все подстанции на нашу цифровую аппаратуру, но на время испытаний оставались работать и старые каналы ЛИСНА, ЭСТ-62 (62-год разработки :)

И мой модем мог работать в новом цифровом стандарте и также эмулировать эти древние системы.

Вызывает шеф, - слушай, какая-то ерунда, прошли непонятные команды на подстанцию, на диспетчерской ничего не передавали, съезди, разберись плз. Поехал, считал с модема все логи,  а я заранее сделал так, чтобы он мог слушать входной и выходной канал и все писать во флешку. Чуял одним местом, что с нашими телемеханиками будет куча проблем. Многие ведь и компа до нас в жизни не видели.

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

Так вот, я подвожу к эксепшенам. У моего модема было аж два watch-dog сторожевых таймера. Стояли с одной целью - пусть он пересбросится, главное, чтобы не завис. Дело даже не в ошибках в программе, а в качестве электропитания на ж/д и конских помехах по всем линиям, от связи до питания. И вот, смотрю по логам, несколько раз он все же пересбросился от такой ахинеи.

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

Но именно в тот раз вач-дог таймер (считай, аналог эксепшна) помог не зависнуть и сохранить управление подстанцией. 

--------

ЗЫ: А вообще был тогда страшный сон - в программе есть ошибка, модем дает команду включить 27 Кв, а на линии работают люди... 

 
Alexey Volchanskiy:

Да, с точки зрения маркета это разумно, но лично для себя я все же предпочел иметь эксепшены, а критические ошибки я бы протоколировал в логи в секции catch{}.

У нас все критические ошибки автоматически протоколируются и даже строку и место ошибки в исходном коде показывает.

Потому что мы изначально заложились на полный контроль и в каждом потенциально опасном месте даже исходное место ошибки(строка и символ) сохранили в собственных обработчиках критических ошибок (встроены в исполняемый код).

То есть, это не общий случай "упало где-то в перекрытом try/catch мегаблоке", а детальный "упало в строке 10, в позиции 30 символа". Вот это называется - качественный и продуманный контроль.
 
Renat Fatkhullin:
У нас все критические ошибки автоматически протоколируются и даже строку и место ошибки в исходном коде показывает.

Потому что мы изначально заложились на полный контроль и в каждом потенциально опасном месте даже исходное место ошибки(строка и символ) сохранили в собственных обработчиках критических ошибок (встроены в исполняемый код).

То есть, это не общий случай "упало где-то в перекрытом try/catch мегаблоке", а детальный "упало в строке 10, в позиции 30 символа". Вот это называется - качественный и продуманный контроль.
Да, про ваши логи я в курсе. Ну а внутри рантайма вы используете эксепшены или нет? )) не верю, что каждый раз ручками проверяете выход за границы и это пресловутое /0
 
Alexey Volchanskiy:
Да, про ваши логи я в курсе. Ну а внутри рантайма вы используете эксепшены или нет? )) не верю, что каждый раз ручками проверяете выход за границы и это пресловутое /0
Проверяем, как и другие языки, кто об этом явно заботится(C/С++ не заботятся). Каждое деление в эксепшен не засунешь, а пределы массивов проверять через эксепшены - это глупость, да и невозможно на практике.

Эксепшены мы ставим и ловим только при вызове DLL из MQL5. Видимо, вы все еще думаете, что эксепшены - это просто и бесплатно.
 
Renat Fatkhullin:
Проверяем, как и другие языки, кто об этом явно заботится(C/С++ не заботятся). Каждое деление в эксепшен не засунешь, а пределы массивов проверять через эксепшены - это глупость, да и невозможно на практике.

Эксепшены мы ставим и ловим только при вызове DLL из MQL5. Видимо, вы все еще думаете, что эксепшены - это просто и бесплатно.
Я только начал изучать, как они внутри устроены. Я же не системный программист. И не могу знать все-все-все, поэтому и завожу темы типа этой, чтобы достичь просветления )
 
Alexey Volchanskiy:
Я только начал изучать, как они внутри устроены. Я же не системный программист. И не могу знать все-все-все, поэтому и завожу темы типа этой, чтобы достичь просветления )
Я тут пока новый человек - недавно пришел. Тоже хотел эту тему поднять. А она оказывается уже год назад обсуждалась. Так я не понял будет конструкция try catch в MQL реализована  или никогда не будет ("оставь надежду навсегда")?  Ведь если сложный математический код из сотен строк писать со всякими многомерными  массивами и т.п., то эта конструкция была бы очень полезна. Хотя нет - сам  ответ  нашел. Админ Renat Fatkhullin пишет, что Вы туда (try catch) косяки  будете  забивать! Значит точно нет! 
 
Aleksey Ivanov:
Я тут пока новый человек - недавно пришел. Тоже хотел эту тему поднять. А она оказывается уже год назад обсуждалась. Так я не понял будет конструкция try catch в MQL реализована  или никогда не будет ("оставь надежду навсегда")?  Ведь если сложный математический код из сотен строк писать со всякими многомерными  массивами и т.п., то эта конструкция была бы очень полезна. Хотя нет - сам  ответ  нашел. Админ Renat Fatkhullin пишет, что Вы туда (try catch) косяки  будете  забивать! Значит точно нет! 

Угу, а 8 лет назад он говорил, что в МТ5 никогда не будет хеджирования. Поживем - увидим. И он не Админ, а CEO, Ген. Дир. по русски.

 
Alexey Volchanskiy:

Почему в MQL5 нет исключений?

А что в МТ5 есть? Да, знаю, язык на уровне Borland C++ 3.0, еще под DOS и WIN 3.1.  91-й год, если не ошибаюсь.)

PS уходите через ДЛЛ в С++/C# и все вам будет - и события пользователя, и исключения, и что душа пожелает. С некоторыми ограничениями, к сожалению ( - вызов только из МТ. Функций обратного вызова не существует.( Но некий эрзац все-же можно организовать.

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