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

 

Честно пытался понять философию использования исключений - но так и не понял. Даже если оставить за бортом, то что исключения сильно тормозят все равно остается много но.

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

Второй аргумент. Любая часть программы имеет только одну конкретную реализацию. Алгоритм в программе только один. Он может быть либо выполнимым, либо нет. Есть реально бесконечное множество вариантов неправильного выполнения алгоритма, и только один правильный вариант его выполнения. С помощью исключений нам предлагается перескочить с дорожки единственно правильного выполнения в бесконечное множество сбоев, ошибок и причин, из-за которых наш код вдруг стал выполнятся с ошибкой. Спрашивается, что мы будем искать в этом множестве? И даже если на бесконечном пространстве решений мы найдем нужную ошибку, что мы с ней будем делать?

 
Vasiliy Sokolov:

Все это очень сильно напоминает goto и те проблемы, которые он в себе несет.

Да, в некоторых программах которые мне встречались так и использовалось:
1. Создаются собственные классы исключений.

2. При определенных ситуациях (не критических, заметьте) бросается нужный тип исключения.  throw new SignalOpenException()

3. Он ловится снаружи в try catch и программа выполняет другую ветку логики.

 

Т.е. такой архитектурный хак, позволяющий в любой удобный момент вылететь из текущего потока выполнения и передать данные о ситуации/вычислении в объекте исключения. Т.е. это не всегда способ обработки ошибки, а эдакий событийный паттерн. Но реализация пользовательских событий уже поддерживается в MQL.

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

Например на 4 шаге возникли проблемы временного характера, пропал интернет и запрашиваемая страница для парсинга недоступна.  А далее как угодно, проанализировав причину, программа может дождаться появления интернета и инициирует новую процедуру.

 
Vasiliy Sokolov:

Честно пытался понять философию использования исключений - но так и не понял. Даже если оставить за бортом, то что исключения сильно тормозят все равно остается много но.

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

Второй аргумент. Любая часть программы имеет только одну конкретную реализацию. Алгоритм в программе только один. Он может быть либо выполнимым, либо нет. Есть реально бесконечное множество вариантов неправильного выполнения алгоритма, и только один правильный вариант его выполнения. С помощью исключений нам предлагается перескочить с дорожки единственно правильного выполнения в бесконечное множество сбоев, ошибок и причин, из-за которых наш код вдруг стал выполнятся с ошибкой. Спрашивается, что мы будем искать в этом множестве? И даже если на бесконечном пространстве решений мы найдем нужную ошибку, что мы с ней будем делать?

Вместо полного контроля за ситуацией предлагаются исключения, которые позволяют отойти в сторону, типа "да ну [Цензура Artyom Trishkin], займусь ка чем нибудь другим". Штука очень полезная, когда делается работа на [Цензура Artyom Trishkin], когда сроки горят.
 
Пожалуйста, давайте писать более нейтральные слова.
 
Vasiliy Sokolov:

Но с исключениями вдруг становится все по-другому, и мы выходим из программы где-то в непонятном месте catch

На самом деле место catch очень даже понятное, если его программист поставил. А вот с критическими ошибками как раз так как вы сказали, нас выкидывают из программы через окно 12 этажа, побросав всю работу и не убрав за собой мусор.

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

 
Alexey Volchanskiy:

DLL я писать умею, зачем мне статьи. 

Статья и не для Вас. Только как пример позиции MQ по этим вопросам.

Кстати, как только мы уходим в DLL, обратно выходить уже нет никакой необходимости. Только для передачи торговых поручений. 

 
Кто тут увлекается исключениями? Если в формуле одно деление на 0, есть ли выигрыш от использования try-catch вместо одного if? 
 
Dmitry Fedoseev:
Кто тут увлекается исключениями? Если в формуле одно деление на 0, есть ли выигрыш от использования try-catch вместо одного if? 
int signal = -1;
try
{
    signal = Threshold/filtSig0() + Threshold/filtSig1() + Threshold/filtSig2() + Threshold/filtSig3() + Threshold/filtSig4() + Threshold/filtSig5() + Threshold/filtSig6() + Threshold/filtSig7();
    if(signal > openThreshold)
        OpenNewOrder(....)
}
catch
{}
Перепишите с проверками без try-catch. Деление на 0 возникает в 1 случае из 100000
 
Yuriy Asaulenko:

Статья и не для Вас. Только как пример позиции MQ по этим вопросам.

Кстати, как только мы уходим DLL, обратно выходить уже нет никакой необходимости. Только для передачи торговых поручений. 

В dll надо еще данные передавать, котировки, состояния ордеров, не все так радужно, на старом MQL4 только так и писал, тоже хватало проблем.
 
Alexey Volchanskiy:
int signal = -1;
try
{
    signal = Threshold/filtSig0() + Threshold/filtSig1() + Threshold/filtSig2() + Threshold/filtSig3() + Threshold/filtSig4() + Threshold/filtSig5() + Threshold/filtSig6() + Threshold/filtSig7();
    if(signal > openThreshold)
        OpenNewOrder(....)
}
catch
{}
Перепишите с проверками без try-catch

Вопрос был более конкретный: сравнение одного try/catch с одним if.

Если 8-мь делений, то 8-мь if, тут конечно if проиграет. А вот 1:1 как?  

Просто у меня деление - это редчайшее  явление и если бывает, то не больше 1-го в одном месте.

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