我如何尝试除了Java中的其他内容,就像在Python中一样?
示例:
try:
something()
except SomethingException,err:
print 'error'
else:
print 'succeeded'
我看到尝试和捕获提到但没有别的。
答案 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
并且知道程序将有效地向前跳到该块的末尾。布尔值要求程序员跟踪做出决定的所有内容。
显然,“跳过前进”和布尔跟踪各自具有自己的优势,并且通常是一种样式选择。