Oop 如何返回面向对象环境中经常发生的错误?
假设您有一个函数,它在一定时间内轮询某种队列和块。如果这段时间过去了,队列上没有显示任何内容,则应该向调用者发送一些超时指示,否则应该返回显示的内容 现在你可以写一些类似的东西:Oop 如何返回面向对象环境中经常发生的错误?,oop,exception,Oop,Exception,假设您有一个函数,它在一定时间内轮询某种队列和块。如果这段时间过去了,队列上没有显示任何内容,则应该向调用者发送一些超时指示,否则应该返回显示的内容 现在你可以写一些类似的东西: class Queue { Thing GetThing(); } 并在超时时引发异常。还是你 写 并返回成功和超时的错误代码 然而,解决方案1的缺点是,在不太繁忙的队列上超时不是例外情况,而是很常见的情况。解决方案2使用返回值来表示错误和难看的语法,因为最终可能会得到一个不包含任何内容的东西 对于这个问题,
class Queue
{
Thing GetThing();
}
并在超时时引发异常。还是你
写
并返回成功和超时的错误代码
然而,解决方案1的缺点是,在不太繁忙的队列上超时不是例外情况,而是很常见的情况。解决方案2使用返回值来表示错误和难看的语法,因为最终可能会得到一个不包含任何内容的东西
对于这个问题,还有其他明智的解决方案吗?在面向对象的环境中,首选的解决方案是什么?为什么不在第一个解决方案中返回null,将其更改为返回一个Thing*?至少从您目前提供的信息来看,它似乎符合要求。在第一种和第二种情况下,您只能抛出异常。当你归还一件物品,或者一件物品&,你没有不归还物品的选择权 如果要在不使用异常的情况下失败,则需要:
class Queue
{
// Either something like this. GetThing retuns NULL on an error,
// GetError returns a specific error code
Thing* GetThing();
int GetError();
// This kind of pattern is common. Return a result code
// and set ppOut to a valid thing or NULL.
int GetThing(Thing** ppOut);
};
只有当错误严重到足以停止应用程序或任何足够大的应用程序组件的执行时,我才会使用异常。但我不会对常见情况使用异常,在这些情况下,我们将继续正常执行或再次执行相同的函数。这将只是对流控制使用异常,这是错误的 因此,我建议您要么使用您提出的第二种解决方案,要么执行以下操作:
class Queue
{
bool GetThing(Thing& t); // true on success, false on failure
string GetLastError();
};
当然,您可以使用int表示错误代码,而不是字符串表示完整的错误消息。或者更好,只需定义类错误并让GetLastError返回它。这取决于对象是否具有值或标识语义-如果对象是std::string或int,则当从流读取达到EOF时,运算符>>所做的正是不改变对值的引用
class Queue
{
bool GetThing(Thing& t); // true on success, false on failure
string GetLastError();
};