Java - 如何做Python的尝试除了其他

Gre*_*reg 44 python java exception

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

例:

try:
   something()
except SomethingException,err:
   print 'error'
else:
   print 'succeeded'
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*che 27

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

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

  • -1要复制Python`try-catch-else`结构的语义,你应该*不*使用finally块,因为即使``try`块中有`return`或未捕获的异常,它也会被执行.只需将`if(success)`块放在`try-catch`之后. (3认同)
  • 谢谢@augurar - 我玩了一遍并重读了其他文档,你确实是对的. (2认同)

mat*_*sco 5

那这个呢?

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

当然,在某些情况下,您想在try / catch / else之后放置更多代码,而该解决方案不适合该解决方案,但如果它是方法中唯一的try / catch块,则它可以工作。


Tez*_*zra 5

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

在 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");
}
Run Code Online (Sandbox Code Playgroud)

Try 没有 else 的原因是因为它旨在捕获特定代码块中的特定错误,该错误要么被处理(通常通过设置默认值或返回),要么冒泡(并且仅提供给finally使确保资源不会因为中断而泄漏,即使您中断了)。在上面的中断示例中,我们通过跳过因错误而不再相关的代码块(跳到下一个逻辑步骤)来处理异常。Ryan 的布尔示例通过记录发生的错误来处理它,并让代码的后半部分对错误发生后的情况做出反应。

我认为逻辑块比布尔方法更好(只要你没有基于抛出的错误的复杂逻辑),因为它不需要读者知道整个函数来理解发生了什么。他们看到break <labelname>;并知道程序将有效地跳到该块的末尾。布尔值要求程序员跟踪对其做出决策的所有内容。

显然,“向前跳”和布尔跟踪各有其优点,并且通常更多地是一种风格选择。