InterfaceExceptionGuardedCall: различия между версиями
Перейти к навигации
Перейти к поиску
(Новая страница: «{{function_begin |template <class _Callable, class ... _Args> auto InterfaceExceptionGuardedCall(_Callable&& callable, _Args&& ... args) noexcept -> return_code_t…») |
|||
Строка 2: | Строка 2: | ||
auto InterfaceExceptionGuardedCall(_Callable&& callable, _Args&& ... args) noexcept -> return_code_t; //2|{{InterfaceExceptionGuardedCall brief}}}} | auto InterfaceExceptionGuardedCall(_Callable&& callable, _Args&& ... args) noexcept -> return_code_t; //2|{{InterfaceExceptionGuardedCall brief}}}} | ||
{{function template paramlist begin}} | {{function template paramlist begin}} | ||
{{function template paramlist add|_Callable|Тип {{cpp_concept|Callable}}-объекта, который вызывается функцией. Прототип объекта должен позволять однозначно выполнить вызов объекта с аргументами <source lang="cpp" inline>std::forward<_Args>(args)...</source>.}} | {{function template paramlist add|_Callable|Тип {{cpp_concept|Callable}}-объекта, который вызывается функцией. Прототип объекта должен позволять однозначно выполнить вызов объекта с аргументами <source lang="cpp" inline>std::forward<_Args>(args)...</source>. Функциональный объект должен либо не возвращать значения (т.е. возвращаемый тип должен быть <source lang="cpp" inline>void</source>), либо возвращать код [[return_code_t]]. В последнем случае, в отсутствие исключений, этот код возвращается функцией [[InterfaceExceptionGuardedCall]].}} | ||
{{function template paramlist add|_Args...|Тип входных аргументов, над которыми вызывается {{cpp_concept|Callable}}-объект <tt>fn</tt>.}} | {{function template paramlist add|_Args...|Тип входных аргументов, над которыми вызывается {{cpp_concept|Callable}}-объект <tt>fn</tt>.}} | ||
{{function template paramlist end}} | {{function template paramlist end}} | ||
Строка 9: | Строка 9: | ||
{{function paramlist add|...args|Набор входных аргументов, над которыми вызывается {{cpp_concept|Callable}}-объект <tt>fn</tt>. Если объект <tt>fn</tt> является нестатическим методом класса, то первым аргуметом должен являтся экземпляр этого класса, над которым вызывается метод.}} | {{function paramlist add|...args|Набор входных аргументов, над которыми вызывается {{cpp_concept|Callable}}-объект <tt>fn</tt>. Если объект <tt>fn</tt> является нестатическим методом класса, то первым аргуметом должен являтся экземпляр этого класса, над которым вызывается метод.}} | ||
{{function paramlist end}} | {{function paramlist end}} | ||
{{function_return_value| | {{function_return_value|Если вызов {{cpp_concept|Callable}}-объекта <tt>fn</tt> привел к возникновению исключения [http://en.cppreference.com/w/cpp/error/exception std::exception] или [https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_chsv_code_exception_templ.html Chusov::Exceptions::ChsvCodeException], возвращается {{chsvlib_error_code|код}} [[return_code_t]], соответствующий этому исключению. Иначе, если <tt>fn</tt> возвращает код [[return_code_t]], то возвращается этот код. Если же функтор определяет в качестве типа возвращаемого значения <source lang="cpp" inline>void</source>, возвращается {{chsvlib_error_code|CHSVERROR_SUCCESS}} (0x20000000).}} | ||
{{function sa begin}} | {{function sa begin}} | ||
{{function sa add|[[InvokeInterfaceGetter]]|{{InvokeInterfaceGetter brief}}}} | {{function sa add|[[InvokeInterfaceGetter]]|{{InvokeInterfaceGetter brief}}}} | ||
Строка 29: | Строка 29: | ||
}); | }); | ||
return nResult; | return nResult; | ||
} | |||
_Success_(_ChsvSucceeded(return)) return_code_t PLATFORM_NATIVE_CALLING_CONVENTION GetNode(std::uint32_t nFlags, _In_opt_ void* pParams, _Deref_out_ ITCPNode** ppNode) | |||
{ | |||
auto nError = InterfaceExceptionGuardedCall([&]() -> void | |||
{ | |||
*ppNode = unique_interface_ptr<ITCPNode>(new CRemoteNodeTCPServer()).release(); | |||
}); | |||
if (_ChsvFailed(nError)) | |||
*ppNode = nullptr; | |||
return nError; | |||
} | } | ||
</source> | </source> | ||
{{example_end}} | {{example_end}} |
Текущая версия на 21:20, 24 декабря 2017
template <class _Callable, class ... _Args>
auto InterfaceExceptionGuardedCall(_Callable&& callable, _Args&& ... args) noexcept -> return_code_t; //2
Осуществляет вызов указанного параметром Callable-объекта с заданным списком аргументов с защитой от исключений std::exception и Chusov::Exceptions::ChsvCodeException, возвращая соответствующий им код типа return_code_t.
- Параметры шаблона
_Callable Тип Callable-объекта, который вызывается функцией. Прототип объекта должен позволять однозначно выполнить вызов объекта с аргументами std::forward<_Args>(args)...
. Функциональный объект должен либо не возвращать значения (т.е. возвращаемый тип должен бытьvoid
), либо возвращать код return_code_t. В последнем случае, в отсутствие исключений, этот код возвращается функцией InterfaceExceptionGuardedCall._Args... Тип входных аргументов, над которыми вызывается Callable-объект fn. - Параметры
fn Функциональный объект типа _Callable, который вызывается над аргументами args.... ...args Набор входных аргументов, над которыми вызывается Callable-объект fn. Если объект fn является нестатическим методом класса, то первым аргуметом должен являтся экземпляр этого класса, над которым вызывается метод. - Возвращаемое значение:
- Если вызов Callable-объекта fn привел к возникновению исключения std::exception или Chusov::Exceptions::ChsvCodeException, возвращается код return_code_t, соответствующий этому исключению. Иначе, если fn возвращает код return_code_t, то возвращается этот код. Если же функтор определяет в качестве типа возвращаемого значения
void
, возвращается CHSVERROR_SUCCESS (0x20000000). - См. также
InvokeInterfaceGetter Вызывает указанный Callable объект, возвращающий return_code_t, и, если объект возвращает код успешного завершения, возвращает указанный индексом выходной параметр через return
- иначе генерирует исключение типа Chusov::Exceptions::ChsvCodeException.InvokeDomainInterfaceGetter Вызывает указанный Callable объект, возвращающий domain_response_code_t, и, если объект возвращает код успешного завершения, возвращает указанный индексом выходной параметр через return
- иначе генерирует исключение типа drc_exception.
Пример
_Success_(_ChsvSucceeded(return)) return_code_t PLATFORM_NATIVE_CALLING_CONVENTION ShiftCurPos(std::int64_t cbShift) noexcept
{
auto nResult = InterfaceExceptionGuardedCall([=]() -> return_code_t
{
auto cbNewOff = this->position() + cbShift;
if ((cbShift < 0 && file_t::file_offset_type(-cbShift) > this->position()) || cbNewOff > this->file().size() || cbNewOff < this->position())
throw Chusov::Exceptions::InvalidParameterException();
this->position() = cbNewOff;
return CHSVERROR_SUCCESS;
});
return nResult;
}
_Success_(_ChsvSucceeded(return)) return_code_t PLATFORM_NATIVE_CALLING_CONVENTION GetNode(std::uint32_t nFlags, _In_opt_ void* pParams, _Deref_out_ ITCPNode** ppNode)
{
auto nError = InterfaceExceptionGuardedCall([&]() -> void
{
*ppNode = unique_interface_ptr<ITCPNode>(new CRemoteNodeTCPServer()).release();
});
if (_ChsvFailed(nError))
*ppNode = nullptr;
return nError;
}