Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Error Handling Policies

Boost , Math Toolkit 2.5.0 , Policy Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Существует два ортогональных аспекта обработки ошибок:

  • Что делать с ошибкой.
  • Какие ошибки возникают.
Available Actions When an Error is Raised

Что делать с ошибкой, инкапсулируется перечисленным типом:

namespace boost { namespace math { namespace policies {
enum error_policy_type
{
   throw_on_error = 0, // throw an exception.
   errno_on_error = 1, // set ::errno & return 0, NaN, infinity or best guess.
   ignore_error = 2, // return 0, NaN, infinity or best guess.
   user_error = 3  // call a user-defined error handler.
};
}}} // namespaces

Различные перечисленные значения имеют следующие значения:

throw_on_error

Выбросит одно из следующих исключений, в зависимости от типа ошибки:

Тип ошибки

Исключения

Ошибка домена

std::domain_error

Ошибка поля

std::domain_error

Ошибка переполнения

std::overflow_error

Ошибка переполнения

std::underflow_error

Ошибка отрицания

std::underflow_error

Ошибка оценки

повышение::math::оценка_error

Ошибка неопределенного результата

std::domain_error

errno_on_error

Будет установлен глобальный ::errno ::errno к одному из следующих значений в зависимости от типа ошибки (часто EDOM = 33 и ERANGE = 34), а затем возвратить то же значение, что и если ошибка была проигнорирована:

Тип ошибки

errno value

Ошибка домена

EDOM

Ошибка поля

EDOM

Ошибка переполнения

ERANGE

Ошибка переполнения

ERANGE

Ошибка отрицания

ERANGE

Ошибка оценки

EDOM

Ошибка неопределенного результата

EDOM

ignore_error

Вернет одно из значений ниже в зависимости от типа ошибки (::errno НЕ изменяется:

Тип ошибки

Возвратная стоимость

Ошибка домена

std::numeric_limits::quiet_NaN()

Ошибка поля

std::numeric_limits::quiet_NaN()

Ошибка переполнения

std::numeric_limits::infinity()

Ошибка переполнения

0

Ошибка отрицания

Денормализованное значение.

Ошибка оценки

Лучшее предположение (возможно, NaN) относительно результата: которое может быть значительно в ошибке.

Ошибка неопределенного результата

Зависит от функции, где произошла ошибка

user_error

Назовите пользователя с определенным обработчиком ошибок: они будут объявлены в бульваре/мате/политике/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 здесь.

Kinds of Error Raised

Эта библиотека сообщает о шести видах ошибок, которые кратко излагаются в следующей таблице:

Тип ошибки

Класс политики

Описание

Ошибка домена

повышение::math::policies::domain_error<действие>

Поднимаются, когда больше или больше аргументов находятся за пределами определенного диапазона функции.

По умолчанию для boost::math::policies::domain_error<throw_on_error>

Ошибка поля

повышение::мат::политика::pole_error<действие>

Выращивается, когда все больше или больше аргументов приведут к оценке функции на полюсе.

По умолчанию для boost::math::policies::pole_error<throw_on_error>

Когда действие throw_on_error бросите >>>>>>>

Ошибка переполнения

повышение::мат::политика::наддувка_error<действие>

Выращивается, когда результат функции находится за пределами репрезентативного диапазона используемого типа плавающей точки.

По умолчанию для boost::math::policies::overflow_error<throw_on_error>

Когда действие throw_on_error затем бросает std::overflow_error.

Ошибка переполнения

повышение::math::policies::underflow_error<действие>

Выращивается, когда результат функции слишком мал, чтобы быть представленным в используемом типе плавающей точки.

По умолчанию для boost::math::policies::underflow_error<ignore_error>

Когда указанное действие throw_on_ror затем выбрасывает >

Ошибка отрицания

повышение::мат::политика::denorm_error<действие>

Выращивается, когда результат функции денормализуется.

По умолчанию для boost::math::policies::denorm_eror<ignore_eror>

Когда действие throw_on_ror

Ошибка округления

повышение::math::policies::rounding_error<действие>

Выращивается Когда одна из округлых функций круглая, пункт или modf называется с аргументом, не имеющим полного представления, или слишком большим, чтобы быть представленным в типе результата.

По умолчанию boost::мат12>::10>политики112>::1>10>круг_error12><throw_on_error>><330>

Когда действие th_onerr затем выбрасывает буст::мат12>::10>круг_окружения

Ошибка оценки

повышение::мат::политика::оценка_error<действие>

Выросли, когда результат функции хорошо определен и конечен, но мы не смогли его вычислить. Обычно это происходит, когда итеративный метод не сходятся. Конечно, в идеале эта ошибка никогда не должна быть поднята: не стесняйтесь сообщать об этом как об ошибке, если это так!

По умолчанию boost::math::policies::val_error<throw_on_error>

Ошибка неопределенного результата

повышение::math::policies::indeterminate_result_error<action>

Выращивается, когда результат функции не определяется для значений, переданных ему.

По умолчанию для boost::math::полис::indeterminate_result_error<ignore_error>

Когда действие th_do_error затем бросить>

Examples

Предположим, мы хотим обратиться к 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

PrevUpHomeNext

Статья Error Handling Policies раздела Math Toolkit 2.5.0 Policy Reference может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Policy Reference ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:45:36/0.010334968566895/1