我正在构建一个框架,我需要对类进行错误检查。我不能使用异常(不允许)。我决定创建一个由所有需要错误报告的类继承的类,这些类具有 ReportError() [对于类本身]和 GetError()等函数。获取调用者使用的最后一个错误以及添加名为 AddError(/ * arguments * /)的自定义错误的函数。该类有一个名为FW_ERROR_TYPES的枚举类型,其中包含一些最常见的默认错误类型。例如,FW_ERROR_INIT(无法正确初始化),FW_ERROR_CTOR(构造对象时出错)等。当一个类报告错误时,也可以添加一个可选的描述,这个描述被记录下来(用于以后的分析,看看是什么去了错误)。这一切都很好,并且很适合我的目的。
当我想添加自定义错误时,问题就出现了。自定义错误无法添加为FW_ERROR_TYPES,因为继承错误类的类不继承枚举。在设计错误类时,我没有预见到这个问题。我原来的'设计'是当调用GetError()来获取最后一个错误时,它将返回一个FW_ERROR_TYPES,因此在使用时会产生编译错误:
if (SomeClass->GetError()) // OR
if (SomeClass->GetError()) == true)
也就是说,它会强制使用它的人专门检查FW_ERROR_TYPES。当我发现继承错误类的类不能扩展FW_ERROR_TYPES枚举时,我不得不使用泛型枚举并强制GetError()返回无符号整数。我将unsigned int定义为FW_ERROR_TYPE,以便至少有一些迹象表明正在返回错误代码。
唷!所以我的问题是,如何改进这种设计(或者废弃它并与更好的设计一起使用)?有没有办法继承枚举类型?我查看了codeproject网站,发现了一个相当复杂的解决方案(如果其他所有方法都失败了,我会给它一个去)。任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
您可以将错误值设为类而不是枚举。您可以使用基本错误类FwError
,使用有用的方法(如GetMessage()
),然后从该基本错误类继承各种错误类型。当您必须检查返回的错误是否是某种类型的错误时,您可以使用运行时类型信息来检查错误类型。如果需要创建新类型的错误,则可以从基本错误类或更具体的子类继承。如果调用者得到了一个从未听说过的类型的错误,那么多态性可以确保它仍然像基类FwError
一样处理它并打印出有意义的消息。
答案 1 :(得分:0)
我发现这个问题的两个(一个'小'复杂的)解决方案: