31#ifndef DW_FRAMEWORK_EXCEPTION_HPP_
32#define DW_FRAMEWORK_EXCEPTION_HPP_
34#include <dwshared/dwfoundation/dw/core/base/ExceptionWithStatus.hpp>
35#include <dw/core/base/Status.h>
36#include <dwshared/dwfoundation/dw/core/container/BaseString.hpp>
37#include <dwshared/dwfoundation/dw/core/language/Function.hpp>
38#include <dwshared/dwfoundation/dw/core/logger/Logger.hpp>
40#define THROW_ON_PARAM_NULL(param) \
41 if (nullptr == param) \
43 throw dw::core::ExceptionWithStatus(DW_INVALID_ARGUMENT, #param " == nullptr ", DW_FUNCTION_NAME, ":", __LINE__); \
46#define GET_STRING(s) #s
50#define FRWK_CHECK_DW_ERROR_MSG(x, description) \
52 dwStatus FRWK_CHECK_DW_ERROR_result{x}; \
53 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_result) \
55 throw dw::core::ExceptionWithStatus(FRWK_CHECK_DW_ERROR_result, __FILE__, ":", __LINE__, " DriveWorks Error ", dwGetStatusName(FRWK_CHECK_DW_ERROR_result), ": ", description); \
59#define FRWK_CHECK_DW_ERROR(x) FRWK_CHECK_DW_ERROR_MSG(x, GET_STRING(x));
61#define FRWK_CHECK_DW_ERROR_IGNORE_SOME(x, fallback, ...) \
63 dwStatus FRWK_CHECK_DW_ERROR_IGNORE_SOME_result{x}; \
64 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_IGNORE_SOME_result) \
66 dwStatus ignoreErros[]{__VA_ARGS__}; \
67 if (std::find(std::begin(ignoreErros), std::end(ignoreErros), FRWK_CHECK_DW_ERROR_IGNORE_SOME_result) != std::end(ignoreErros)) \
69 DW_LOGD << __FILE__ << ":" << __LINE__ \
70 << " Ignoring Error: " \
71 << dwGetStatusName(FRWK_CHECK_DW_ERROR_IGNORE_SOME_result) << ". Falling back on calling " << GET_STRING(fallback) \
72 << dw::core::Logger::State::endl; \
73 FRWK_CHECK_DW_ERROR_IGNORE_SOME_result = fallback; \
74 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_IGNORE_SOME_result) \
76 throw dw::core::ExceptionWithStatus(FRWK_CHECK_DW_ERROR_IGNORE_SOME_result, "After ignoring errors from ignore list, fallback operation %s encountered DriveWorks error.", GET_STRING(fallback)); \
80 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_IGNORE_SOME_result) \
82 throw dw::core::ExceptionWithStatus(FRWK_CHECK_DW_ERROR_IGNORE_SOME_result, "DriveWorks error not in ignore list."); \
86#define FRWK_CHECK_DW_ERROR_NOTHROW(x) \
88 dwStatus FRWK_CHECK_DW_ERROR_NOTHROW_result{x}; \
89 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_NOTHROW_result) \
91 DW_LOGE << __FILE__ << ":" << __LINE__ \
92 << " DriveWorks exception but not thrown: " \
93 << dwGetStatusName(FRWK_CHECK_DW_ERROR_NOTHROW_result) \
94 << dw::core::Logger::State::endl; \
98#define FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME(x, fallback, ...) \
100 dwStatus FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME_result{x}; \
101 dwStatus ignoreErros[]{__VA_ARGS__}; \
102 if (std::find(std::begin(ignoreErros), std::end(ignoreErros), FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME_result) != std::end(ignoreErros)) \
104 FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME_result = fallback; \
106 if (DW_SUCCESS != FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME_result) \
108 DW_LOGE << __FILE__ << ":" << __LINE__ \
109 << " DriveWorks exception but not thrown: " \
110 << dwGetStatusName(FRWK_CHECK_DW_ERROR_NOTHROW_IGNORE_SOME_result) \
111 << dw::core::Logger::State::endl; \
117#define FRWK_CHECK_CUDA_ERROR(x) \
120 cudaError_t FRWK_CHECK_CUDA_ERROR_result{cudaGetLastError()}; \
121 if (cudaSuccess != FRWK_CHECK_CUDA_ERROR_result) \
123 throw dw::core::ExceptionWithStatus(DW_CUDA_ERROR, cudaGetErrorString(FRWK_CHECK_CUDA_ERROR_result)); \
127#define FRWK_CHECK_CUDA_ERROR_NOTHROW(x) \
130 cudaError_t FRWK_CHECK_CUDA_ERROR_NOTHROW_result{cudaGetLastError()}; \
131 if (cudaSuccess != FRWK_CHECK_CUDA_ERROR_NOTHROW_result) \
133 DW_LOGE << __FILE__ << ":" << __LINE__ \
134 << " CUDA error but not thrown: " \
135 << cudaGetErrorString(FRWK_CHECK_CUDA_ERROR_NOTHROW_result) \
136 << dw::core::Logger::State::endl; \
140#define FRWK_CHECK_NVMEDIA_ERROR(e) \
142 NvMediaStatus FRWK_CHECK_NVMEDIA_ERROR_ret{e}; \
143 if (NVMEDIA_STATUS_OK != FRWK_CHECK_NVMEDIA_ERROR_ret) \
145 throw dw::core::ExceptionWithStatus(DW_NVMEDIA_ERROR, "NvMedia error occured"); \
160 template <
typename TryBlock>
161 static dwStatus
guardWithReturn(TryBlock
const& tryBlock, ::dw::core::Logger::Verbosity verbosity = ::dw::core::Logger::Verbosity::ERROR)
163 return guardWithReturnFunction(tryBlock, verbosity);
166 template <
typename TryBlock>
167 static dwStatus
guard(TryBlock
const& tryBlock, ::dw::core::Logger::Verbosity verbosity = ::dw::core::Logger::Verbosity::ERROR)
169 static_assert(std::is_same<void,
typename std::result_of<TryBlock()>::type>::value,
170 "tryBlock must return void");
171 dw::core::Function<dwStatus()> tryBlockFunc{[&]() -> dwStatus {
175 return guardWithReturnFunction(tryBlockFunc, verbosity);
179 static dwStatus guardWithReturnFunction(dw::core::Function<dwStatus()>
const& tryBlock, dw::core::Logger::Verbosity verbosity);
static dwStatus guardWithReturn(TryBlock const &tryBlock, ::dw::core::Logger::Verbosity verbosity=::dw::core::Logger::Verbosity::ERROR)
static dwStatus guard(TryBlock const &tryBlock, ::dw::core::Logger::Verbosity verbosity=::dw::core::Logger::Verbosity::ERROR)