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

 
А чем вам не исключение))

....
... //что-то опасное
r=GetLastError();
if(r==A) Print("Всё пропало")
else Print("Вроде обошлось");
...
 
Andrey Dik:
Юрий, я специально подчеркнул:
понимаешь? это ошибка программиста, недочет который требует исправления, а не обхода с помощью исключения.

всё что делает программа - задумано не спроста, не так ли? понравится ли тебе, если МТ будет за тебя принимать решения в критических ситуациях? - не думаю. хотя метаквоты вполне могли бы включить подобные механизмы в работе ex программ, но они этого не делают и поступают правильно.
>>а не обхода с помощью исключения.
Вообще то   в серьезных  системах -  это как раз обрабатывается исключением.

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

Сейчас у метаквотов  продукт работает в режиме в режиме: - ты сам дятел, если тупо не проверил делитель. Зато у них при этом система проще.
В прошлом писал операционные системы реального времени, и они работали в объеме всего озу 32 кб  , но даже там была обработка деления на ноль. И вся система не зависала,    и не требовала  дополнительной проверки делителя  перед каждой операцией деления,  которых в системе была уйма.

 
Понимаешь , я о той ситуации  при которой достаточно добиться того, что бы программа не вылетала а продолжала работать.
я тебе опять повторяю , в любом серьезном процессоре  есть аппаратная поддержка прерывания при делении на ноль. ( Вот Леша меня явно понимает, ибо он разработчик железа в прошлом )
И все серьезные системы используют это прерывание, и разработчики железа не говорят программистам: - Программисты вы дятлы , если не  проверяете  перед делением  делитель, иначе мы просто остановим микро код процессора  и тогда поможет только перезапуск процессора по кнопке reset и именно так и происходит если не обрабатывается это прерывание.
Это чудесное аппаратное свойство , как раз и используют что бы изящно -  а не тупо  разрулить ситуацию.
Ну не включили метаквоты обработку такой ситуации - хотя  процессор Intel это позволяет на аппаратном уровне,  ну и бог с ними ,  им так удобней, выход все равно есть: тупо , а не изящно -  проверять перед делением делитель. 
 
Aliaksandr Hryshyn:
А чем вам не исключение))

....
ResetLastError();
... //что-то опасное
r=GetLastError();
if(r==A) Print("Всё пропало")
else Print("Вроде обошлось");
...
Попробуйте это обработать, так что бы система не вылетела и эксперт продолжил работу!

//+------------------------------------------------------------------+
//|                                                      tstzero.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(3);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
     int a=0;
     int b=2;
     int c;
     c=0;
     a=b/c;
  }

 
Aleksey Semenov:
как же нет экзепшинов, есть они в узких местах мкла и скорее встроены в язык и невидимы глазу, ворнинги же возникают когда срабатывает встроенный экзепшен, когда программа обрабатывает некорректные данные, иначе - выпадали бы с критом и мкл не был бы таких надёжным, внутри предопределённых функций экзепшенов полно, а то что ручками мы не можем обозначить узкое место и написать что делать в случае попадания на крит ошибку то это для упрощения языка было сделано
Ренат утверждает, что в MQL делается проверка параметров, он ярый противник эксепшенов, как можно судить по высказываниям.
 
Yuriy Zaytsev:
 
Понимаешь , я о той ситуации  при которой достаточно добиться того, что бы программа не вылетала а продолжала работать.
я тебе опять повторяю , в любом серьезном процессоре  есть аппаратная поддержка прерывания при делении на ноль. ( Вот Леша меня явно понимает, ибо он разработчик железа в прошлом )
И все серьезные системы используют это прерывание, и разработчики железа не говорят программистам: - Программисты вы дятлы , если не  проверяете  перед делением  делитель, иначе мы просто остановим микро код процессора  и тогда поможет только перезапуск процессора по кнопке reset и именно так и происходит если не обрабатывается это прерывание.
Это чудесное аппаратное свойство , как раз и используют что бы изящно -  а не тупо  разрулить ситуацию.
Ну не включили метаквоты обработку такой ситуации - хотя  процессор Intel это позволяет на аппаратном уровне,  ну и бог с ними ,  им так удобней, выход все равно есть: тупо , а не изящно -  проверять перед делением делитель. 

Тут не нужно быть разработчиком железа, достаточно вместо вечернего пива заняться самообразованием. Гуглим "прерывания просессора" или "interrupt"и изучаем, все довольно просто.

Вот табличка прерывания для x86, стрелочками обозначил аппаратные прерывания, которые возникают при определенных событиях в процессоре. Если бы их не было, винда падала бы через каждые 10 секунд ))

ште 

 
Alexey Volchanskiy:

Тут не нужно быть разработчиком железа, достаточно вместо вечернего пива заняться самообразованием. Гуглим "прерывания просессора" или "interrupt"и изучаем, все довольно просто.

Вот табличка прерывания для x86, стрелочками обозначил аппаратные прерывания, которые возникают при определенных событиях в процессоре. Если бы их не было, винда падала бы через каждые 10 секунд ))

Причем здесь железо, Алексей?
 
Alexey Volchanskiy:
Ренат утверждает, что в MQL делается проверка параметров, он ярый противник эксепшенов, как можно судить по высказываниям.
Я нигде не видел, что бы Ренат говорил о встроенных проверках на уровне языка. Наоборот, он всегда говорит, что нужно проверять всю информацию рыночного окружения.
 
Andrey Dik:
Причем здесь железо, Алексей?
Yuriy Zaytsev:
 
Понимаешь , я о той ситуации  при которой достаточно добиться того, что бы программа не вылетала а продолжала работать. 
я тебе опять повторяю , в любом серьезном процессоре  есть аппаратная поддержка прерывания при делении на ноль( Вот Леша меня явно понимает, ибо он разработчик железа в прошлом )
 
Alexey Volchanskiy:
Yuriy Zaytsev:
 
Понимаешь , я о той ситуации  при которой достаточно добиться того, что бы программа не вылетала а продолжала работать. 
я тебе опять повторяю , в любом серьезном процессоре  есть аппаратная поддержка прерывания при делении на ноль( Вот Леша меня явно понимает, ибо он разработчик железа в прошлом )
Ещё раз спрашиваю: причем здесь железо?

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

Но в контексте программ на MQL4/5 я спрашиваю в третий раз: причем здесь железо?

Алексей, уже реально лепишь горбатого. Мотивы для меня неясны, ну да ладно...
 
Andrey Dik:
Я нигде не видел, что бы Ренат говорил о встроенных проверках на уровне языка. Наоборот, он всегда говорит, что нужно проверять всю информацию рыночного окружения.

Они у них уже сделаны. Подход такой - проверки вместо эксепшнов.

void OnStart()
{
    ResetLastError();
    datetime dt = StringToTime("2017.01.35 10:52");
    int err = GetLastError();
    Print("err=", ErrorDescription(err), "  dt=", dt);  

    dt = StringToTime("2016.01&08 10:52");
    err = GetLastError();
    Print("err=", ErrorDescription(err), "  dt=", dt);  

    dt = StringToTime("2016.0108 10:52");
    err = GetLastError();
    Print("err=", ErrorDescription(err), "  dt=", dt);  

    dt = StringToTime("2016.01.08 48:52:256");
    err = GetLastError();
    Print("err=", ErrorDescription(err), "  dt=", dt);  

    Print("end");
}
2017.01.31 11:02:36.537 TestExceptions (EURUSD,M1)      err=В строке ошибочная дата  dt=2017.02.04 10:52:00
2017.01.31 11:02:36.546 TestExceptions (EURUSD,M1)      err=В строке нет даты  dt=2016.01.01 00:00:00
2017.01.31 11:02:36.546 TestExceptions (EURUSD,M1)      err=В строке нет даты  dt=2024.12.01 10:52:00
2017.01.31 11:02:36.546 TestExceptions (EURUSD,M1)      err=В строке ошибочное время  dt=2016.01.08 23:52:59
2017.01.31 11:02:36.546 TestExceptions (EURUSD,M1)      end
***
Причина обращения: