用户定义的例外:我们何时使用它们?什么是“特殊”情况?

时间:2011-11-01 03:57:49

标签: java custom-exceptions

我确信这个问题已在许多最佳实践书籍中得到解决,但仍然...... 大多数时候,我看到自定义异常的错误使用示例,因此我想知道使用它们会有什么好处?

特别是,目前我正在为编译器课程开发类型检查器。因此,我有一个SymbolTable类,它与Map非常相似。与普通地图的主要区别在于每个符号都有最多定义一次,因此如果我们尝试插入的键已经存在于SymbolTable中,则put(String,Object)操作应该失败。

所以这就是问题:每当我们尝试插入一个密钥,并且该密钥已经存在于SymbolTable中时,SymbolTable应该如何表现?我们应该有一个

boolean insert(String key, Object value);

在插入失败的情况下返回“false”的方法?或者我们应该使用返回值为“void”的insert方法并在遇到重复值时抛出异常?

提前致谢:)

4 个答案:

答案 0 :(得分:2)

决定是使用例外还是返回值是几个“力”的平衡:

  • 调用者可以忽略返回值并继续下一行,但不能忽略异常。例外情况往往用于忽视问题并继续存在可能导致更大问题的情况。
  • 异常会给调用者带来负担,因为处理调用者的代码比检查返回值更复杂。因此,当简单的返回值足够时,它们通常会被避免。
  • 另一方面,异常可以减轻直接调用者检查结果的负担,因为它可以相信如果出现问题,堆栈将被解除为{{1阻止其他地方。
  • 异常处理比普通返回更复杂,因此如果经常抛出它们会有性能损失。例外情况通常用于预计不会经常发生的情况。
  • 当错误信息和“正常”结果属于不同类型时,抛出异常通常比将不相关的东西转换为相同的返回值更好(例如,使方法返回catch以便它可以返回字符串或数字)。

在你的符号表示例中,我可能只是返回false,因为它可能会使代码更简单,但要么合理,要么根据程序其余部分的设计。

答案 1 :(得分:2)

例外情况应该是特殊情况

在该特定情况下,例如,如果方法名为insert(),我会将列表密钥上的视为正常情况并更新它。

此外,虽然不应该使用异常来控制代码流,但是返回布尔值指示失败/成功也不是更好的选择(可能有很多失败的情况,而False表示没有任何关于此事的内容)。

最重要的是,我会做一些事情:

// Failures can happen 
void add(key, value) throws AlreadyOnMapException

// Update if already on list
void insert(key, value);

// Make available Contains() methods to control the flow by avoiding exceptions
boolean containsKey(key);

boolean containsValue(value);

答案 2 :(得分:0)

这实际上取决于您决定预期会发生什么。使用您的插入示例,是否存在重复,或者是否存在重复?如果情况异常(即通常不应该发生的事情)那么它就是例外。

您不应该使用流量控制的例外。如果,例如10%的时间预计存在重复,那么使用例外将是无效的。但是,如果程序员的一个错误(即一个意外的动作)在不应该放入的情况下放入副本,则可能是一个例外。

这已被讨论过死亡,试着搜索一下。

答案 3 :(得分:0)

User defined exceptions: when do we use them?

我确信在许多书籍中都有很好的定义方案可以使用基于自定义的例外。然而,最近我观察到有趣的使用基于定制的异常,即改进日志记录。例如,B类的A类调用函数和B类函数的函数调用C类函数,所有这些函数都可以抛出IO Exception。因此,如果IO异常出现在C类函数中,请捕获该异常,记录它,现在创建基于自定义异常的对象并抛出该对象。每个调用函数都会捕获基于自定义的异常以及其他异常,每当它们捕获基于自定义的异常时,它们都不会记录它,因为它将是多余的,它们只是将它丢回。