Java - 如何做Python尝试除了Else

时间:2010-08-13 15:14:10

标签: java python exception

我如何尝试除了Java中的其他内容,就像在Python中一样?

示例:

try:
   something()
except SomethingException,err:
   print 'error'
else:
   print 'succeeded'

我看到尝试和捕获提到但没有别的。

4 个答案:

答案 0 :(得分:23)

我并不完全相信我喜欢它,但这相当于Python的其他内容。它消除了将成功代码放在try块末尾的问题。

bool success = true;
try {
    something();
} catch (Exception e) {
    success = false;
    // other exception handling
}
if (success) {
    // equivalent of Python else goes here
}

答案 1 :(得分:4)

这个怎么样?

try {
    something();
} catch (Exception e) {
    // exception handling
    return;
}
// equivalent of Python else goes here

当然,在某些情况下,您希望在try / catch / else之后添加更多代码,并且此解决方案不适合那里,但如果它是您方法中唯一的try / catch块,则可以正常工作。

答案 2 :(得分:2)

虽然没有内置方法可以做到这一点。你可以做类似的事情来达到类似的效果。这些评论解释了为什么这不是完全相同的事情。

如果somethingThatCouldError()的执行通过,则会打印YAY!!。如果出现错误,将打印SAD

try {
    somethingThatCouldError();
    System.out.println("YAY!!");
    // More general, code that needs to be executed in the case of success
} catch (Exception e) {
    System.out.println("SAD");
    // code for the failure case
}

这种方式比Python更不明确。但它也达到了同样的效果。

答案 3 :(得分:1)

虽然Ryan's answer的布尔值跟踪错误很好,但我认为在这种情况下使用“逻辑块”来“向前跳过”会更好。

在Java中,允许您使用<optional-label-name followed by ':'>{...}创建任意上下文块(作用域)并为其分配标签。您可以致电break <labelname>;

以下是我可以玩的一个例子:

private static void trycatchelsetest(boolean err) {
    myLogicBlock: {
        try {
            System.out.println("TRY");
            { //unlabeled block for demonstration
            if(err)
                throw new IOException("HELLO!");
            }
        } catch(IOException e) {
            System.out.println("CATCH");
            break myLogicBlock;
        } finally {
            System.out.println("FINALLY");
        }

        System.out.println("ELSE");
    }

    System.out.println("END");
}

Try没有别的原因的原因是,它旨在从特定的代码块中捕获特定的错误,该特定的代码要么被处理(通常通过设置默认值或返回),要么冒泡(和{{ 1}}仅用于确保资源不会由于中断而泄漏,即使您中断也是如此。在上面的break示例中,我们通过跳过由于错误而不再相关的代码块来处理异常(跳至下一逻辑步骤)。 Ryan的boolean示例通过注意到发生的错误来处理它,然后让代码的后半部分对事实发生之后的发生做出反应。

我认为逻辑块比布尔方法更好(只要您没有基于抛出的错误而产生的复杂逻辑),因为它不需要读者知道整个函数就可以理解会发生什么。他们看到finally并且知道程序将有效地向前跳到该块的末尾。布尔值要求程序员跟踪做出决定的所有内容。

显然,“跳过前进”和布尔跟踪各自具有自己的优势,并且通常是一种样式选择。

相关问题