Имитация исключений

 

Как известно, в MQL5 нет исключений и конструкций try...catch

У меня есть класс. При создании объекта, в конструкторе проверяется некое условие (например, наличие файла).

Хочу чтобы скрипт убился бы по моему приказу или сгенерировал ошибку. Тогда терминал прекратит его исполнение. 

С экспертом понятно (ExpertRemove()). Деление на ноль не проходит. По дефолту терминал такие ошибки э... прощает.

Вот пример кода. Почему печатается "I am still alive"?

void OnStart() {
    StopExecution("kill yourself");
    Print("I am still alive");
}

// -----------------------------------------------------------------------------
// Аварийное завершение эксперта/скрипта
// -----------------------------------------------------------------------------
void StopExecution(string message) {
    PrintFormat("%s / %s", __FUNCTION__, message);
    if (MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_EXPERT) {
        ExpertRemove();
    }
    else {
        int one = 1/MathAbs(0);
    }
}

Вопрос: как гарантированно смоделировать ошибку?

Ответ создавать для каждого скрипта свой проект с настройками - не годится.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
 
Похоже, что при оптимизации компилятор вырезает "тупые" операторы.
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   if(StopExecution("kill yourself") < 0)
      return;
       
   Print("I am still alive");
}



// -----------------------------------------------------------------------------
// Аварийное завершение эксперта/скрипта
// -----------------------------------------------------------------------------
int StopExecution(string message) {
    PrintFormat("%s / %s", __FUNCTION__, message);
    if (MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_EXPERT) {
        ExpertRemove();        
    }
    else if(1/MathAbs(0) == 0){

        return(-1);
    }
    
    return(0);
}
 
Malik Arykov:

 Деление на ноль не проходит. По дефолту терминал такие ошибки э... прощает.

void OnStart()
{
   int i = 1;
   Print(1 / --i); //Zero divide, check divider for zero to avoid this error 
}
 
Igor Makanu #:

Спасибо Игорь! То что нужно.