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

Should exceptions have a flag/message, or should there be an exception type per error?

本文关键字:异常 错误 或者 类型 是否 标志 消息      更新时间:2023-10-16

对于可能因多种原因引发异常的对象,最佳实践是什么?

例如,如果我有一个汇编器对象,它有自己的异常类型,该异常类型派生自 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是一种独特的类型。