异常是否有标志/消息,或者每个错误是否应该有异常类型?

时间:2015-04-13 07:01:43

标签: c++ exception

出于多种原因,可以抛出异常的对象的最佳做法是什么?

例如,如果我有一个汇编程序对象,它有自己的异常类型派生自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();

更好吗?但我担心这可能会导致许多小物体基本上做同样的事情?

2 个答案:

答案 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是一种独特的类型。