Исключения используются, когда существует опасность бегства или незаконных операций в пустом списке.
Ключевой пример - взять длину непрекращающегося списка, например.
length(enum_from(1))
Это защищено с помощью исключения:
lazy_exception
Обратите внимание, что это реализовано таким образом, что определение
BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
Это позволит пользователю отключить исключения на свой страх и риск.
BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH
В настоящее время определяется как 1000, и пользователь может определить свое собственное значение.
В функции длины это как реализуется:
struct Length {
template <typename Sig> struct result;
template <typename This, typename L>
struct result<This(L)>
{
typedef size_t type;
};
template <class L>
size_t operator()( const L& ll ) const {
typename L::delay_result_type l = delay(ll);
size_t x = 0;
while( !null(l)() ) {
l = tail(l);
++x;
if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
break;
}
#ifndef BOOST_PHOENIX_NO_LAZY_EXCEPTIONS
if (x > BOOST_PHOENIX_FUNCTION_MAX_LAZY_LIST_LENGTH)
throw lazy_exception("Your list is too long!!");
#endif
return x;
}
};