如果它不抛出任何异常,只能执行代码的优雅方式

时间:2017-07-21 18:28:37

标签: java exception-handling

这是我的问题,我很惊讶以前没有发现它。基本上,在伪造的代码中,这是我的情况:

try
{
    User user = currentUser(); //Throws UnauthenticatedException if not logged in.
    //Do stuff with the user.
}
catch (UnauthenticatedException e)
{
    //Do nothing, it's perfectly fine to not do the above code
    //if the user isn't logged in.
}

我真的没有问过如何处理这种特殊情况,我只是想一个例子会有所帮助。我的一般问题是,是否有一种优雅的方法来处理抛出异常的情况,不保证采取进一步行动?那个空的挡块伤害了我的大脑思考,它是如此不优雅。

5 个答案:

答案 0 :(得分:1)

这很简单:你确实想要一个空的catch块的情况几乎不存在!

举个例子:如果登录失败... 10次 - 你认为你的代码不应该对此做些什么吗?因此,您可以

而不是空捕获
  • 记录失败,以便您稍后了解该用户尝试登录的时间和频率
  • 计算失败(例如在某个时刻暂停该用户)
  • 最明显的 - 你不认为你应该向用户提供有意义的信息

即使你的代码只是一个例子 - 正如你所看到的那样,提出反对拥有空捕获的参数是非常容易的!

除此之外:当一个操作失败时 - 是否真的适合抛出异常呢?!含义:当空的捕获可能时 - 为什么代码设计为完全抛出?当捕捉看起来毫无意义时,投掷的重点是什么?

答案 1 :(得分:0)

可能你可以添加一个方法currentUser返回一个像这样的布尔值:

currentUser.isLogged()

如果没有当前用户,您也可以返回null,因此测试user而不是捕获异常

答案 2 :(得分:0)

你可以抛出异常。但是,如果用户未登录,则将抛出异常并且程序将结束。

public void valid() throws UnauthenticatedException{
    User user = currentUser(); //Throws UnauthenticatedException if not logged in.
}

通常,当该方法无法自行解决异常时,应该从方法抛出异常。

为了"优雅代码"这种方法看起来更好,但可能没有你想要的期望。当它归结为它时,只需热身试图捕捉: - )

答案 3 :(得分:0)

空捕获很好。它们通常不是空的,但对它们来说也是如此。对于异常来说,制定比if语句更好的控制流并不罕见。实际上,这就是首先引入异常的原因,以便将错误处理收集到更好的位置。在异常之前,它可能会变得非常混乱,特别是如果你必须跳过堆栈帧。

采用以下示例:

public void mainLoop()
{
    while(true)
    {
        try
        {
            Thread.sleep(1000);
            f();
        }
        catch (InterruptedException ex)
        {
            // Don't care; this thread expected to not die when interrupted
        }
    }
}

有时,这确实是处理它的最佳方式。

至于“不应该用于控制流的例外”这个论点......

另外,有时候将你认为错误案例的所有内容收集到一个地方很方便,如果它们都拥有相同的逻辑,那么你甚至可以使用多次捕获。

public void verifyInput()
{
    try
    {
        int n = Integer.parseInt( txtInput.getText() );

        if(n < minimum || n > maximum)
            throw new MyDataInvalidException("data out of bounds");

        sendFormData();
    }
    catch (NumberFormatException | MyDataInvalidException ex)
    {
        // Don't care. Each widget on the form is already set up to display
        //   information about invalid input, so if you press "enter" in
        //   this state just ignore it
    }
}

现在,上面的代码示例还有一个额外的好处,即如果稍后您获得了以不同方式处理错误输入的新要求,您可以快速轻松地维护它。

例如,您会收到投诉,表明每个GUI小部件显示其无效状态是不够的,“请按,如果我按回车,请向我显示一个对话框,其中包含'无效数据:请检查所有字段'。让我知道我需要向上滚动才能看到文本字段的“X blah blah错误消息”“现在你只需用消息框弹出替换该注释,或许。

或者,如果需要在堆栈的上方处理,请更改verifyInput以使用抛出。

答案 4 :(得分:-3)

在这里回答我自己的问题,解释我是如何误解的,并希望如果其他人以同样的方式误解,这将使他们直截了当。

抛出异常的原因是,如果你遇到异常,你的程序已经完成了一些不应该发生的事情。在我的情况下,我正在访问当前用户并尝试基本上将错误用作false if (user is logged in) DESCRIPTION = "Simple voip application" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM ="file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r1" SRC_URI += "file://rttapp.c" SRC_URI += "file://include" SRC_URI += "file://lib" S = "${WORKDIR}" CFLAGS_prepend += "-I${WORKDIR}/include -DPJ_AUTOCONF=1 -DPJ_IS_BIG_ENDIAN=0 ->DPJ_IS_LITTLE_ENDIAN=1" LDFLAGS_append += "-L${WORKDIR}/lib -lpjsua2-arm-poky-linux-gnueabi -lstdc++ ->lpjsua-arm-poky-linux-gnueabi -lm -lrt -lpthread -lasound" do_compile() { ${CC} ${CFLAGS} ${LDFLAGS} rttapp.c -o rttapp } 的情况,这与该方法的设计完全不一致。如果没有用户登录,则该方法会引发错误,因为它是专门设计为在用户未登录时永远不会被调用的。

问题的真正解决方案,至少在我的情况下,并且,我怀疑,在我意识到这个问题之前,许多其他人试图做我正在做的事情,是“不要做那。”只要按照预期使用方法,不要试图破解它。