![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Error HandlingBoost , Math Toolkit 2.5.0 , Chapter 1. Overview
|
![]() |
Warning |
---|---|
Действия ошибки по умолчанию включают исключение с информативным сообщением об ошибке. Если вы не попытаетесь поймать исключение, вы не увидите сообщение! |
Виды ошибок, которые могут быть подняты:
Возникает, когда один или несколько аргументов для функции находятся вне диапазона.
Возникает, когда конкретные аргументы вызывают оценку функции на полюсе без четко определенной остаточной стоимости. Например, еслиtgammaоценивается в точности -2, функция приближается к различным предельным значениям в зависимости от того, приближаетесь ли вы к чуть выше или чуть ниже -2. Следовательно, функция не имеет четко определенного значения, и ошибка полюса будет повышена.
Возникает, когда результат либо бесконечен, либо слишком велик, чтобы представлять в численном типе возвращаемую функцией.
Возникает, когда результат не равен нулю, но слишком мал, чтобы быть представленным каким-либо другим значением в типе, возвращаемом функцией.
Возникает, когда возвращаемый результат будет денормализованным.
Возникает, когда аргумент в пользу одной из функций округленияtrunc,roundиmodfне может быть представлен в виде целого типа, находящегося за пределами диапазона типа результата.
Возникает, если метод оценки неизвестен или когда произошла внутренняя ошибка, которая не позволила оценить результат: это никогда не должно произойти, но если это произойдет, то это, вероятно, будет связано с итеративным методом, который не сходится достаточно быстро.
Возникает, когда результат функции не определен для значений, которые были ему переданы.
Действие, предпринятое каждым условием ошибки, определяется действующей Политикой. Это может быть изменено по всей программе путем установки некоторых макросов конфигурации, или в области пространства имен, или на сайте вызова (путем указания конкретной политики в вызове функции).
Имеющиеся меры включают:
Бросает исключение, наиболее соответствующее условию ошибки.
Устанавливает::errno на соответствующее значение, а затем возвращает наиболее подходящий результат
Игнорирует ошибку и просто возвращает наиболее подходящий результат.
Называетсяпоставляемый пользователем обработчик ошибок.
Следующие таблицы показывают все перестановки ошибок и действий, причемпо умолчанию для каждой ошибки показано жирным шрифтом:
Table 1.1. Possible Actions for Domain Errors
Меры |
поведение |
---|---|
throw_on_error |
Бросает< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращение< |
Ошибка пользователя |
Возвращает результат< |
Table 1.2. Possible Actions for Pole Errors
Меры |
поведение |
---|---|
throw_on_error |
Бросает< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращение< |
Ошибка пользователя |
Возвращает результат< |
Table 1.3. Possible Actions for Overflow Errors
Меры |
поведение |
---|---|
throw_on_error |
Бросает< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращение< |
Ошибка пользователя |
Возвращает результат< |
Table 1.4. Possible Actions for Underflow Errors
Меры |
поведение |
---|---|
throw_on_error |
Броски< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращение 0 |
Ошибка пользователя |
Возвращает результат< |
Table 1.5. Possible Actions for Denorm Errors
Меры |
поведение |
---|---|
throw_on_error |
Броски< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращает денормализованное значение. |
Ошибка пользователя |
Возвращает результат< |
Table 1.6. Possible Actions for Rounding Errors
Меры |
поведение |
---|---|
throw_on_error |
Бросок< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращает наибольшее репрезентабельное значение целевого целого типа (или самое отрицательное значение, если аргумент функции был меньше нуля). |
Ошибка пользователя |
Возвращает результат< |
Table 1.7. Possible Actions for Internal Evaluation Errors
Меры |
поведение |
---|---|
throw_on_error |
Броски< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращает самое близкое приближение. |
Ошибка пользователя |
Возвращает результат< |
Table 1.8. Possible Actions for Indeterminate Result Errors
Меры |
поведение |
---|---|
throw_on_error |
Броски< |
errno_on_error |
Устанавливает< |
Ошибка |
Возвращает результат по умолчанию, который зависит от функции, где произошла ошибка. |
Ошибка пользователя |
Возвращает результат< |
Все эти условия погрешности приведены в усилителе пространства имен::math::policies, сделанном доступным, например, заявлением пространства имен с использованием<namespace
boost::math::policies;
>или индивидуальным использованием деклараций<usingboost::math::policies::overflow_error;
>.
Гибкость текущей реализации должна быть достаточно очевидной: поведение по умолчанию было выбрано на основе обратной связи во время официального обзора этой библиотеки. Было сочтено, что:
::errno
>.Существуют некоторые макро-определения предварительного процессора, которые можно использовать дляизменения по умолчанию политики. См. также раздел политики.
В качестве примера можно привести учебник по политике. Изменение политических дефолтов.
Полный исходный код этого типичного примера передачи «плохого» аргумента (отрицательных степеней свободы) в распределение t Студентав примере обработки ошибок.
Различные типы ошибок описаны более подробно ниже.
Когда специальная функция проходит аргумент, который находится за пределами диапазона значений, для которых эта функция определена, то функция возвращает результат:
boost::math::policies::raise_domain_error<T>(FunctionName, Message, Val, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему, Val — значение, которое было вне диапазона, аPolicy— текущая политика, используемая для функции, которая была названа.
Политика по умолчанию этой функции заключается в том, чтобы добавить исключение std::domain_error C++. Но если политиказаключается в том, чтобы игнорировать ошибку или установить глобальную<::errno
>, то NaN будет возвращен.
Это поведение выбрано для обеспечения совместимости с поведением.ISO/IEC 9899:1999 Языки программирования - Cи сПроект технического доклада о расширении библиотеки C++, 2005-06-24, раздел 5.2.1, пункт 6:
"Каждая из функций, заявленных выше, возвращает NaN (Not a Number), если какое-либо значение аргумента является NaN, но не сообщает об ошибке домена. В противном случае каждая из указанных выше функций должна сообщать об ошибке домена только для тех значений аргументов, для которых:
"описание функции возвращает пункт явно указывает домен, и эти аргументы выходят за пределы указанного домена; или
"соответствующее математическое значение функции имеет ненулевой воображаемый компонент; или
"соответствующая математическая функция математически не определена.
«Примечание 2: математическая функция математически определена для данного набора значений аргумента, если она явно определена для этого набора значений аргумента или если ее ограничивающее значение существует и не зависит от направления подхода».
Обратите внимание, что для поддержки сообщений об ошибках, богатых информацией, при броске исключений<Message
>должно содержатьувеличение. Форматраспознанный спецификатор формата: аргумент<Val
>вставляется в сообщение об ошибке в соответствии с используемым спецификатором.
Например, если<Message
>содержит «%1%», то оно заменяется значением<Val
>с полной точностью T, где как «%.3g» будет содержать значение<Val
>до 3 цифр. Подробнее см. документациюBoost.Format.
Когда специальная функция проходит аргумент, который находится на полюсе без четко определенной остаточной стоимости, то функция возвращает результат:
boost::math::policies::raise_pole_error<T>(FunctionName, Message, Val, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему,<Val
>— значение аргумента, находящегося на полюсе, иПолитика— текущая политика, используемая для функции, которая была названа.
По умолчанию эта функция выполняет исключение std::domain_error. Нополитики обработки ошибокмогут быть использованы для изменения этого, например, на<ignore_error
>и возврата NaN.
Обратите внимание, что для поддержки сообщений об ошибках, богатых информацией, при броске исключений<Message
>должно содержатьувеличение. Форматпризнанный спецификатор формата: аргумент<val
>вставляется в сообщение об ошибке в соответствии с используемым спецификатором.
Например, если<Message
>содержит «%1%», то оно заменяется значением<val
>с полной точностью T, где как «%.3g» будет содержать значение<val
>до 3 цифр. Подробнее см. документациюBoost.Format.
Когда результат специальной функции слишком велик, чтобы вписаться в аргумент типа плавающей точки, то функция возвращает результат:
boost::math::policies::raise_overflow_error<T>(FunctionName, Message, Policy);
Если<T
>— это тип с плавающей точкой, переданный функции,<FunctionName
>— это название функции,<Message
>— сообщение об ошибке, описывающее проблему, иПолитика— это текущая политика, используемая для функции, которая была названа.
Политика по умолчанию для этой функции заключается в том, что<std::overflow_error
>C++ исключен. Но если, например, используется политика<ignore_error
>, то возвращается<std::numeric_limits<T>::infinity()
>. В этой ситуации, если тип<T
>не поддерживает бесконечности, возвращается максимальное значение для типа.
Если результат специальной функции известен как ненулевой, но вычисленный результат недотекает до нуля, то функция возвращает результат:
boost::math::policies::raise_underflow_error<T>(FunctionName, Message, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему, аполитика— текущая политика, используемая для названной функции.
Версия этой функции по умолчанию возвращает ноль. Но с другой политикой, как<throw_on_error
>, бросает<std::underflow_error
>C++ исключение.
Если результатом специальной функции является денормированное значениеz, то функция возвращает результат:
boost::math::policies::raise_denorm_error<T>(z, FunctionName, Message, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему, аполитика— текущая политика, используемая для названной функции.
По умолчанию версия этой функции возвращаетz. Но с другой политикой, как<throw_on_error
>бросает<std::underflow_error
>C++ исключение.
Когда специальная функция вычисляет результат, который, как известно, ошибочен, или где результат неисчислим, она называет:
boost::math::policies::raise_evaluation_error<T>(FunctionName, Message, Val, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему,<Val
>— ошибочное значение, аполитика— текущая политика, используемая для названной функции.
По умолчанию эта функция выполняется для броска<boost::math::evaluation_error
>.
Обратите внимание, что для поддержки информации, богатой сообщениями об ошибках при броске исключений,<Message
>должен содержатьBoost.Formatпризнанный спецификатор формата: аргумент<val
>вставляется в сообщение об ошибке в соответствии с используемым спецификатором.
Например, если<Message
>содержит «%1%», то оно заменяется значением<val
>с полной точностью T, где как «%.3g» будет содержать значение<val
>до 3 цифр. Подробнее см. документациюBoost.Format.
Когда результат специальной функции неопределён для переданного ему значения, то функция возвращает результат:
boost::math::policies::raise_overflow_error<T>(FunctionName, Message, Val, Default, Policy);
Если<T
>— это тип с плавающей точкой, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему, Val — значение, для которого результат неопределён, Default — альтернативный результат по умолчанию, который должен быть возвращен для политик<ignore_error
>и<errno_on_erro
>, аПолитика— текущая политика, используемая для функции, которая была названа.
По умолчанию для этой функции<ignore_error
>: Обратите внимание, что этот тип ошибки зарезервирован для ситуаций, когда результат математически неопределён или неопределён, но тем не менее существует условность того, каким должен быть результат: например, стандарт C99 указывает, что результат 00равен 1, хотя результат на самом деле математически неопределён.
Когда одна из функций округления,,, truncили, modfвызывается аргументом, который не имеет целочисленного представления или слишком велик, чтобы быть представленным в типе результата, то возвращаемое значение является результатом вызова:
boost::math::policies::raise_rounding_error<T>(FunctionName, Message, Val, Policy);
Если<T
>— это тип плавающей точки, переданный функции,<FunctionName
>— название функции,<Message
>— сообщение об ошибке, описывающее проблему,<Val
>— ошибочный аргумент, аполитика— текущая политика, используемая для названной функции.
По умолчанию эта функция выполняется для броска<boost::math::rounding_error
>.
Обратите внимание, что для поддержки информации, богатой сообщениями об ошибках при броске исключений,<Message
>должен содержатьBoost.Formatпризнанный спецификатор формата: аргумент<val
>вставляется в сообщение об ошибке в соответствии с используемым спецификатором.
Например, если<Message
>содержит «%1%», то оно заменяется значением<val
>с полной точностью T, где как «%.3g» будет содержать значение<val
>до 3 цифр. Подробнее см. документациюBoost.Format.
Многие специальные функции оценивают свои результаты с более высокой точностью, чем их аргументы, чтобы обеспечить полную точность машины в результате: например, функция, прошедшая поплавковый аргумент, может оценивать его результат с использованием двойной точности внутри. Поэтому многие из перечисленных выше ошибок могут возникать не во время оценки, а при преобразовании результата в более узкий тип результата. Функция:
template <class T, class Policy, class U> T checked_narrowing_cast(U const& val, const char* function);
Используется для выполнения этих преобразований и вызовет обработчики ошибок, перечисленные выше, напереполнение,подтеканиеилиденормализацию.
Статья Error Handling раздела Math Toolkit 2.5.0 Chapter 1. Overview может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Overview ::
реклама |