我使用try {} catch(){}来处理返回模板类型的函数中的错误。
T get (int iOffset) const
{
try {
checkIndex(iOffset);
}
catch (char const* msg) {
std::cout << msg << std::endl;
}
int index = (m_iReadIdx + iOffset) % m_iBuffLength;
float a = m_ptBuff[index];
return a;
}
该函数首先调用checkIndex
来检查输入是否超出范围,如果是,则抛出错误。
但是,如果get
引发错误,我不希望外部checkIndex
返回任何值,因为返回的值可能被其他函数使用或打印错误。如果我在catch区块中返回,我不知道该返回什么,因为它是一个模板。如果我不这样做,catch块后面的代码仍会被执行,因此会返回一个值。
有没有办法做到这一点?我是C ++的新手,想知道人们在这种情况下通常如何进行错误处理?谢谢!
答案 0 :(得分:2)
但是,如果checkIndex引发错误,我不希望外部get返回任何值,因为返回的值可能被其他函数使用或打印错误。
您可以在记录
后始终重新抛出异常T get (int iOffset) const
{
try {
checkIndex(iOffset);
}
catch (char const* msg) {
std::cout << msg << std::endl;
throw; // Just re-throw the exception
}
int index = (m_iReadIdx + iOffset) % m_iBuffLength;
float a = m_ptBuff[index];
return a;
}
答案 1 :(得分:2)
您也可以在这种情况下使用可选项。这种结构的一个想法是指出由于某些错误而无法正确设置值。
std::optional< T > get (int iOffset ) const
{
try {
checkIndex(iOffset);
}
catch (char const* msg) {
std::cout << msg << std::endl;
return std::optional< T >();
}
int index = (m_iReadIdx + iOffset) % m_iBuffLength;
float a = m_ptBuff[index];
return return std::optional< T >( a );
}
使用此类功能可能如下所示:
auto result = get( someOffset );
if( result )
{
// correct, processing result
}
答案 2 :(得分:1)
最简单的方法之一就是首先要做出决定:如果无法返回正确的&#39;那么你的get()究竟应该返回什么?值? 在许多情况下,它只是0,或-1,或其他一些特殊值。 然后代码变得非常简单:
T get (int iOffset) const
{
T a;
try {
checkIndex(iOffset);
int index = (m_iReadIdx + iOffset) % m_iBuffLength;
a = m_ptBuff[index];
}
catch (char const* msg) {
a = special_value_for_errors;
std::cout << msg << std::endl;
}
return a;
}