这是滥用异常处理吗?

时间:2010-09-21 16:05:04

标签: java exception-handling return-type

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

首先,它应该只返回两个,所以我将其返回类型设为Boolean

像:

public static boolean isLoteWaitingForImage()

并且出现了一些业务逻辑,它可能有另一个结果,因此该方法被修改为

public static boolean isLoteWaitingForImage() throws ImageNotPendingException 

如果某个select返回null值,但其中一行返回true,如果不是null我将返回false。如果未从select throw ImageNotPendingException where获取任何行,则它不适用于isLoteWaitingForImage()子句中的给定过滤器。


还考虑过这样做,我有一个新的类,它有效的类型从方法public class LoteResponse { public static int VALID = 1; public static int INVALID = 2; public static int NO_IMAGE_PENDING = 3; } 返回,有3个常量属性叫做:

public static int isLoteWaitingForImage() {

    return LoteResponse.VALID;
}

所以我将有这个新方法:

{{1}}

有了这个问题,我有两个问题:

  • 关于如何完成此需求的任何“其他”想法?

  • 哪种方法更好?

5 个答案:

答案 0 :(得分:11)

是的,这对我来说似乎是一种虐待。

如果在没有图像挂起时不应该调用该方法,则抛出异常是合理的。客户总能知道吗?它是代表一个错误,还是其他一些错误的东西让他们在那个州调用它?如果没有,请不要使用例外。

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

public enum LoteResponseState
{
    Valid,
    Invalid,
    NoImagePending;
}

public static LoteResponseState getLoteState()
{
    ...
}

答案 1 :(得分:5)

  • 如果您希望调用isLoteWaitingForImage()的代码直接负责处理“无图像待处理”条件以及其他条件,则使用多个返回值但使用枚举,而不是整数!
  • 如果立即调用代码无法有效地处理“无图像待处理”条件,而通常会在调用堆栈的更高处处理,则异常是更好的选择。

答案 2 :(得分:1)

我绝对同意enum是最好的选择。

作为一般规则,如果某个操作不被视为很少发生的严重错误,则不应抛出异常。仅针对当前方法无法以有用方式处理任何方式的错误抛出异常,但作为典型返回值。

答案 3 :(得分:1)

我不是专家所以不要把它作为最佳实践建议,但我认为在这个特殊情况下使用例外似乎是一种矫枉过正。如上所述,我会寻求一些简单的返回值。

如果您真的想要跟踪情况,无论出于调试或开发原因,您都可以抛出RuntimeException("why a runtime exception is thrown")。如果你没有做一些特殊的异常,编写一个自己的异常似乎太过分了。

我希望这有点道理。 :)

答案 4 :(得分:-2)

寻找例外方式。它确实有一个更明确的调用者接口。如果调用者需要处理此ImageNotPendingException,则将其设置为Checked Exception。

返回枚举是一件奇怪的事情,因为它通过将业务细节和处理委托给调用者来减少封装。通过这种方式,来电者需要知道太多的calee。

抱歉我的英语不好。