异常是否应具有标志/消息,或者每个错误应具有异常类型
Should exceptions have a flag/message, or should there be an exception type per error?
对于可能因多种原因引发异常的对象,最佳实践是什么?
例如,如果我有一个汇编器对象,它有自己的异常类型,该异常类型派生自 std::exception,我可以设置 what() 返回的消息。所以我可能会做:
throw Asm::Exception("Duplicated function name");
throw Asm::Exception("Unknown instruction");
throw Asm::Exception("Wrong number of arguments");
但我想知道是否:
throw Asm::DuplicateFunctionNameException();
throw Asm::UnknownInstructionException();
throw Asm::WrongNumberOfArgumentsException();
更好吗?但我担心这可能会导致许多小物体本质上在做同样的事情?
没有"更好"或"更差"的方法。事实上,这两个概念是相当正交的。这实际上完全取决于所需的功能。您应该根据此问题的答案进行选择:
我是否需要能够根据引发异常的错误类型采取不同的操作?
如果答案是肯定的,那么最好使用不同的异常类型:
try {
// stuff
} catch (Asm::DuplicateFunctionNameException& e) {
foo();
e.foo();
} catch (Asm::UnknownInstructionException& e) {
bar();
e.bar();
} catch (Asm::WrongNumberOfArgumentsException& e) {
baz();
e.baz();
}
另请注意,此处的每种类型的异常都可能具有与该特定错误类型相关的成员。
如果答案是否定的,那么你就可以使用一种类型。请注意,具有不同的类型也不会阻止您使用不同的消息。
throw Asm::Exception("Wrong number of arguments")
已经显示了问题,真的。该异常应具有函数名称、实际参数和预期参数。但是,大多数例外不需要这些字段。从逻辑上讲,这意味着Asm::ArgCountException
是一种独特的类型。
相关文章:
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 打开CV异常错误,尽管我的代码是正确的
- 异常错误C++ //Visual Studio
- 提升序列化异常错误
- 返回内存异常错误的矢量
- 使用用户定义的函数查找完美数时出现浮点异常错误
- cv::内存位置出现异常错误
- OpenCV未经处理的异常错误
- 分数简化算法,浮点异常错误
- 为什么我会收到浮点异常错误
- 文本框为空时,C++Windows窗体应用程序出现未处理的异常错误
- 文本框为空时C++ Windows 窗体应用程序未处理的异常错误
- 函数传递映射时出现异常错误
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- 未处理的异常错误
- C++:关闭控制台应用后出现异常错误
- 写入对象时运行时引发异常错误
- C++ C# 包装器空异常错误
- Coin3D(Open Inventor)中出现未处理的异常错误
- Stack Pop()函数出现未处理的异常错误