这是我的问题,我很惊讶以前没有发现它。基本上,在伪造的代码中,这是我的情况:
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.
}
我真的没有问过如何处理这种特殊情况,我只是想一个例子会有所帮助。我的一般问题是,是否有一种优雅的方法来处理抛出异常的情况,不保证采取进一步行动?那个空的挡块伤害了我的大脑思考,它是如此不优雅。
答案 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
}
的情况,这与该方法的设计完全不一致。如果没有用户登录,则该方法会引发错误,因为它是专门设计为在用户未登录时永远不会被调用的。
问题的真正解决方案,至少在我的情况下,并且,我怀疑,在我意识到这个问题之前,许多其他人试图做我正在做的事情,是“不要做那。”只要按照预期使用方法,不要试图破解它。