На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Сообщение "sqrt: DOMAIN error" , Как найти грабли?
    Дело в следующем: в проге есть несколько вызовов функции расчёта квадратного sqrt(...)
    Время от времени при расчёте вылетает ошибка "sqrt: DOMAIN error" (то есть, говоря по русски - аргумент sqrt <= 0) и программа вываливается.
    естественно, сначала при всех вызовах sqrt стал проверять , что аргумент > 0 .
    Не помогло, пошёл дальше . При ВСЕХ вызовах sqrt поставил конструкцию вида
    ExpandedWrap disabled
            if (diskr < 1E-30 || a == 0)
              MessageBox(NULL, "Задача не имеет решения", "Нет решения", MB_ICONINFORMATION);
            else
            {
              double x1, x2;
              try
              {
                x1 = (-b+sqrt(diskr))/(2*a);
                x2 = (-b-sqrt(diskr))/(2*a);
              }
              catch(...)
              {
                MessageBox(NULL, "Ошибка sqrt в recalcModelBtnClick()", "Ошибка sqrt()", MB_ICONERROR);
                x1 = x2 = -1.;
              }
              .......
            }

    Кое где помогло, стали выскакивать поименованные ошибки. Хотя не понимаю, почему вдруг могла появиться ошибка обработки? ведь проверял же на положительное значение. Ну это ладно ещё.
    Всё равно лезут время от времени ошибки "sqrt: DOMAIN error" несмотря на то, что без try нет ни одного вызова sqrt.

    Где искать грабли ? :wall:
      Шурик П., может _matherr поможет в определении ошибки?
        MSDN: The sqrt function returns the square-root of x. If x is negative, sqrt returns an indefinite, by default.

        она возвращает ошибку, а не исключение генерит.
          Я обычно делаю так
          ExpandedWrap disabled
            #include <math.h>
            static int matherr_id = -1;
            int _matherr( struct _exception *except )
            {
              if( matherr_id == 0 ) //our spy, no message
              {
                matherr_id = except->type; //error flag (type of error)
                return matherr_id; //no message (return != 0)
              }
              return 0;    // use the default actions
              //one line:
              //return ( matherr_id == 0 ) ? (matherr_id = except->type) : 0;
            }
                     // применительно к коду автора, юзать можно так
                      matherr_id = 0;
                      x1 = (-b+sqrt(diskr))/(2*a);
                      x2 = (-b-sqrt(diskr))/(2*a);
                      if( matherr_id != 0 )
                      {
                        //в matherr_id - тип ошибки (DOMAIN, SING, OVERFLOW и т.д.), можно вывести
                        MessageBox(NULL, "Ошибка sqrt в recalcModelBtnClick()", "Ошибка sqrt()", MB_ICONERROR);
                        x1 = x2 = -1.;
                      }
                      else
                        matherr_id = -1;
            Sorry всем и модераторам в том числе за тиражирование темы, что-то движок форума глючит. Пишет мне SQL ошибку создания темы, а тему тем не менее создаёт. Потому я и наплодил жуткое количество тем.

            Теперь по сути вопроса: просветите идиотика. Я был всю дорогу уверен, что конструкция
            try
            {
            Могущий вызвать сбой код
            }
            catch
            {
            Обработчик ошибок, в том числе и свой вывод сообщения об ошибке
            }

            - гарантировано подавит любое стандартное сообщение об ошибке и заменит его моим. Или я неправ?
              Нет, это зависит от типа ошибки.
                Цитата Adil @
                Нет, это зависит от типа ошибки.

                Как понять - будет с помощью try ... catch(...) подавлено стандартное сообщение или нет?

                Adil
                Конструкция с matherr, как я понимаю, вообще не блокирует исходное сообщение.
                Просто позволяет на хвост ошибки повесить ещё и своё сообщение. Или блокирует?
                Сообщение отредактировано: Шурик П. -
                  Цитата Шурик П. @
                  Как понять - будет с помощью try ... catch(...) подавлено стандартное сообщение или нет?
                  Повторяю - это зависит от типа ошибки. Как ты мог убедится на собственном примере - для мат ошибок сообщение об ошибке не "давится".
                  Цитата Шурик П. @
                  Или блокирует?
                  А справку почитать по _matherr - слабо? Или просто попробовать, если читать лень?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0355 ]   [ 16 queries used ]   [ Generated: 21.11.25, 08:28 GMT ]