代码之家  ›  专栏  ›  技术社区  ›  Garis M Suero

这是处理滥用的例外情况吗?

  •  0
  • Garis M Suero  · 技术社区  · 14 年前

    我有这个方法,可以返回三种不同的响应。

    起初,它应该只返回两个,所以我将其返回类型设置为布尔值

    像:

    public static boolean isLoteWaitingForImage()
    

    一些业务逻辑表明它可以有另一个结果,因此该方法被修改为

    public static boolean isLoteWaitingForImage() throws ImageNotPendingException 
    

    如果某个 select 返回A null 值,但返回一行 true 如果不是的话 无效的 我会回来的 false . 如果没有从 选择 我会的 throw ImageNotPendingException 因为它不适用于 where 条款。


    还考虑过这样做,我有了这个新类,它具有从方法返回的有效类型 isLoteWaitingForImage() ,调用了3个常量属性:

    public class LoteResponse {
        public static int VALID = 1;
        public static int INVALID = 2;
        public static int NO_IMAGE_PENDING = 3;
    }
    

    所以我会有一个新的方法:

    public static int isLoteWaitingForImage() {
    
        return LoteResponse.VALID;
    }
    

    把这个放在桌子上,我有两个问题:

    • 关于如何完成这一需求有什么“其他”想法吗?

    • 哪种方法是更好的实践?

    5 回复  |  直到 14 年前
        1
  •  11
  •   Jon Skeet    14 年前

    是的,我觉得这是一种虐待。

    如果在没有图像挂起时不应该简单地调用该方法,那么抛出异常是合理的。客户总是能知道吗?它是否代表一个bug,或者其他一些严重错误的东西,让他们在这种状态下调用它?如果没有,不要使用异常。

    在我看来你需要一个枚举。

    public enum LoteResponseState
    {
        Valid,
        Invalid,
        NoImagePending;
    }
    
    public static LoteResponseState getLoteState()
    {
        ...
    }
    
        2
  •  5
  •   Michael Borgwardt    14 年前
    • 如果您期望调用的代码 isLoteWaitingForImage() 直接负责处理“无图像挂起”等情况,然后使用多个返回值, 但是使用枚举,而不是ints!
    • 如果“no image pending”条件不能由即时调用代码有效地处理,而通常会在调用堆栈的更高层处理,那么异常是更好的选择。
        3
  •  1
  •   ChessWhiz    14 年前

    我完全同意枚举是最佳选择。

    一般来说,如果某个操作不被认为是很少发生的严重错误,则不应引发异常。只对当前方法无法以有效方式处理的错误引发异常,但是 作为一个典型的返回值。

        4
  •  1
  •   posdef    14 年前

    我不是专家,所以不要把这当作最佳实践建议,但我认为在这个特定的案例中使用异常似乎是一种过度杀伤力。我将使用上面提到的一些简单的返回值。

    如果您真的想跟踪情况,无论出于什么调试或开发原因,您可能会抛出 RuntimeException("why a runtime exception is thrown") 相反。如果您没有在异常中做一些特别的事情,那么编写自己的异常似乎就太过分了。

    我希望这有点道理。:)

        5
  •  -2
  •   Leonardo    14 年前

    走例外的路。它确实有一个更显式的调用接口。如果调用方需要处理此ImageNotPendingException,请将其设置为选中的异常。

    返回枚举是一件奇怪的事情,因为它通过将业务细节和处理委托给调用方来减少封装。这样打电话的人就需要对calee了解得太多。

    抱歉我英语不好。