出于多种原因,可以抛出异常的对象的最佳做法是什么?
例如,如果我有一个汇编程序对象,它有自己的异常类型派生自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();
更好吗?但我担心这可能会导致许多小物体基本上做同样的事情?
答案 0 :(得分:4)
没有“更好”或“更差”的方法。实际上,这两个概念是非常正交的。它完全取决于所需的功能。你应该根据这个问题的答案选择:
我是否需要根据抛出异常的错误类型采取不同的操作?
如果答案是肯定的,那么最好使用不同的异常类型:
try {
// stuff
} catch (Asm::DuplicateFunctionNameException& e) {
foo();
e.foo();
} catch (Asm::UnknownInstructionException& e) {
bar();
e.bar();
} catch (Asm::WrongNumberOfArgumentsException& e) {
baz();
e.baz();
}
另请注意,此处的每种类型的异常都可能包含与该特定错误类型相关的成员。
如果答案是否定的,那么你可以使用一种类型。请注意,使用不同类型不会阻止您使用不同的消息。
答案 1 :(得分:1)
throw Asm::Exception("Wrong number of arguments")
已经显示出问题了。该异常应具有函数名,实际参数和预期参数。但是,大多数例外都不需要这些字段。从逻辑上讲,这意味着Asm::ArgCountException
是一种独特的类型。