这是滥用异常处理吗?

Gar*_*ero 0 java exception-handling return-type

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

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

喜欢:

public static boolean isLoteWaitingForImage()
Run Code Online (Sandbox Code Playgroud)

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

public static boolean isLoteWaitingForImage() throws ImageNotPendingException 
Run Code Online (Sandbox Code Playgroud)

如果某个select返回一个null值,但是它返回一行true,如果不是null我将返回false.如果没有行从收购select,我会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;
}
Run Code Online (Sandbox Code Playgroud)

所以我将有这个新方法:

public static int isLoteWaitingForImage() {

    return LoteResponse.VALID;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 关于如何实现这一需求的任何"其他"想法?

  • 哪种方法更好?

Jon*_*eet 11

是的,这看起来像对我的虐待.

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

它看起来像你需要一个枚举.

public enum LoteResponseState
{
    Valid,
    Invalid,
    NoImagePending;
}

public static LoteResponseState getLoteState()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*rdt 5

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

  • @posdef:因为很容易忘记单个值的含义,无论是在编写代码还是尝试读取代码时.给出条件名称将节省维护问题. (2认同)