![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Error Handling PoliciesBoost , Math Toolkit 2.5.0 , Policy Reference
|
Тип ошибки |
Исключения |
---|---|
Ошибка домена |
std::domain_error |
Ошибка поля |
std::domain_error |
Ошибка переполнения |
std::overflow_error |
Ошибка переполнения |
std::underflow_error |
Ошибка отрицания |
std::underflow_error |
Ошибка оценки |
повышение::math::оценка_error |
Ошибка неопределенного результата |
std::domain_error |
Будет установлен глобальный ::errno
::errno
к одному из следующих значений в зависимости от типа ошибки (часто EDOM = 33 и ERANGE = 34), а затем возвратить то же значение, что и если ошибка была проигнорирована:
Тип ошибки |
errno value |
---|---|
Ошибка домена |
EDOM |
Ошибка поля |
EDOM |
Ошибка переполнения |
ERANGE |
Ошибка переполнения |
ERANGE |
Ошибка отрицания |
ERANGE |
Ошибка оценки |
EDOM |
Ошибка неопределенного результата |
EDOM |
Вернет одно из значений ниже в зависимости от типа ошибки (::errno
НЕ изменяется:
Тип ошибки |
Возвратная стоимость |
---|---|
Ошибка домена |
std::numeric_limits |
Ошибка поля |
std::numeric_limits |
Ошибка переполнения |
std::numeric_limits |
Ошибка переполнения |
0 |
Ошибка отрицания |
Денормализованное значение. |
Ошибка оценки |
Лучшее предположение (возможно, NaN) относительно результата: которое может быть значительно в ошибке. |
Ошибка неопределенного результата |
Зависит от функции, где произошла ошибка |
Назовите пользователя с определенным обработчиком ошибок: они будут объявлены в бульваре/мате/политике/error_handling.hpp, но фактические определения должны быть предоставлены пользователем:
namespace boost{ namespace math{ namespace policies{ template <class T> T user_domain_error(const char* function, const char* message, const T& val); template <class T> T user_pole_error(const char* function, const char* message, const T& val); template <class T> T user_overflow_error(const char* function, const char* message, const T& val); template <class T> T user_underflow_error(const char* function, const char* message, const T& val); template <class T> T user_denorm_error(const char* function, const char* message, const T& val); template <class T> T user_rounding_error(const char* function, const char* message, const T& val); template <class T> T user_evaluation_error(const char* function, const char* message, const T& val); template <class T> T user_indeterminate_result_error(const char* function, const char* message, const T& val); }}} // namespaces
Обратите внимание, что строки функции и message могут содержать спецификаторы формата "% 1%", предназначенные для использования в сочетании с Boost. Формат. Если эти строки должны быть представлены конечному пользователю программы, то спецификатор формата «% 1%» должен быть заменен именем типа T в строке функции, а если в строке message имеется спецификатор% 1%, то его следует заменить значением val.
Есть больше информации об пользовательских обработчиках ошибок в tutorial здесь.
Эта библиотека сообщает о шести видах ошибок, которые кратко излагаются в следующей таблице:
Тип ошибки |
Класс политики |
Описание |
---|---|---|
Ошибка домена |
повышение::math::policies::domain_error<действие> |
Поднимаются, когда больше или больше аргументов находятся за пределами определенного диапазона функции. По умолчанию для
|
Ошибка поля |
повышение::мат::политика::pole_error<действие> |
Выращивается, когда все больше или больше аргументов приведут к оценке функции на полюсе. По умолчанию для Когда действие throw_on_error бросите |
Ошибка переполнения |
повышение::мат::политика::наддувка_error<действие> |
Выращивается, когда результат функции находится за пределами репрезентативного диапазона используемого типа плавающей точки. По умолчанию для Когда действие throw_on_error затем бросает |
Ошибка переполнения |
повышение::math::policies::underflow_error<действие> |
Выращивается, когда результат функции слишком мал, чтобы быть представленным в используемом типе плавающей точки. По умолчанию для Когда указанное действие throw_on_ror затем выбрасывает |
Ошибка отрицания |
повышение::мат::политика::denorm_error<действие> |
Выращивается, когда результат функции денормализуется. По умолчанию для Когда действие throw_on_ror |
Ошибка округления |
повышение::math::policies::rounding_error<действие> |
Выращивается Когда одна из округлых функций круглая, пункт или modf называется с аргументом, не имеющим полного представления, или слишком большим, чтобы быть представленным в типе результата. По умолчанию Когда действие th_onerr затем выбрасывает |
Ошибка оценки |
повышение::мат::политика::оценка_error<действие> |
Выросли, когда результат функции хорошо определен и конечен, но мы не смогли его вычислить. Обычно это происходит, когда итеративный метод не сходятся. Конечно, в идеале эта ошибка никогда не должна быть поднята: не стесняйтесь сообщать об этом как об ошибке, если это так! По умолчанию
|
Ошибка неопределенного результата |
повышение::math::policies::indeterminate_result_error<action> |
Выращивается, когда результат функции не определяется для значений, переданных ему. По умолчанию для Когда действие th_do_error затем бросить |
Предположим, мы хотим обратиться к tgamma
, чтобы вести себя с помощью C-совместимого способа и установить глобальный ::errno
, а не бросить исключение, мы можем достичь этого на сайте вызова с помощью:
#include <boost/math/special_functions/gamma.hpp> using boost::math::tgamma; //using namespace boost::math::policies; may also be convenient. using boost::math::policies::policy; using boost::math::policies::evaluation_error; using boost::math::policies::domain_error; using boost::math::policies::overflow_error; using boost::math::policies::domain_error; using boost::math::policies::pole_error; using boost::math::policies::errno_on_error; // Define a policy: typedef policy< domain_error<errno_on_error>, pole_error<errno_on_error>, overflow_error<errno_on_error>, evaluation_error<errno_on_error> > my_policy; double my_value = 0.; // // Call the function applying my_policy: double t1 = tgamma(my_value, my_policy()); // Alternatively (and equivalently) we could use helpful function // make_policy and define everything at the call site: double t2 = tgamma(my_value, make_policy( domain_error<errno_on_error>(), pole_error<errno_on_error>(), overflow_error<errno_on_error>(), evaluation_error<errno_on_error>() ) );
Предположим, мы хотим, чтобы статистическое распределение возвращало бесконечности, а не выбрасывало исключения, тогда мы можем использовать:
#include <boost/math/distributions/normal.hpp> using boost::math::normal_distribution; using namespace boost::math::policies; // Define a specific policy: typedef policy< overflow_error<ignore_error> > my_policy; // Define the distribution, using my_policy: typedef normal_distribution<double, my_policy> my_norm; // Construct a my_norm distribution, using default mean and standard deviation, // and get a 0.05 or 5% quantile: double q = quantile(my_norm(), 0.05); // = -1.64485
Статья Error Handling Policies раздела Math Toolkit 2.5.0 Policy Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Policy Reference ::
реклама |