Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何使用Python';除了别的,我们试试看_Java_Python_Exception - Fatal编程技术网

Java-如何使用Python';除了别的,我们试试看

Java-如何使用Python';除了别的,我们试试看,java,python,exception,Java,Python,Exception,除了Java中的其他功能外,我如何像Python中一样进行尝试 例如: try: something() except SomethingException,err: print 'error' else: print 'succeeded' 我看到有人提到了try-and-catch,但除此之外没有其他内容。虽然没有内置的方法来实现这一点。你可以做一些类似的事情来获得类似的结果。这些评论解释了为什么这不是完全一样的事情 如果somethingThatCouldError()

除了Java中的其他功能外,我如何像Python中一样进行尝试

例如:

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

我看到有人提到了try-and-catch,但除此之外没有其他内容。

虽然没有内置的方法来实现这一点。你可以做一些类似的事情来获得类似的结果。这些评论解释了为什么这不是完全一样的事情

如果
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的显式性稍差。但它也达到了同样的效果。

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

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

try {
    something();
} catch (Exception e) {
    // exception handling
    return;
}
// equivalent of Python else goes here
当然,在某些情况下,您希望在try/catch/else之后添加更多代码,但这种解决方案不适合这种情况,但如果它是您的方法中唯一的try/catch块,它就可以工作。

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

在Java中,您可以使用
{…}
创建任意上下文块(作用域)并为其分配标签。你可以调用
break

以下是我的意思示例,您可以使用:

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

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


显然,“向前跳”和布尔跟踪各有其优点,通常更像是一种样式选择。

Close,但是如果“YAY”下面的代码引发异常怎么办?它会印上“耶”和“悲伤”。@Adam,没错。但是,您可以将
Yay
放在
try
的底部。我的观点是,即使
somethingtheatCoulderRor()
没有引发异常,也可以执行异常处理程序。我不认为这正是格雷格想要的。这个代码块根本不等同于一个
try except else
:它还将从“else”块捕获
异常<代码>尝试除其他外
不会这样做,Ryan答案中的解决方案也不会这样做。除了不等价之外,这也违背了原则,
try-catch
应该只包含尽可能小的代码块。@jjnguy:是的;我是说它一点也不相似,只是表面上相似;此外,永远不要使用它,因为它容易出错,使代码不那么明显。在许多情况下(例如,小方法),您可以从
catch
块重新抛出或返回,因此,您可以将
else
逻辑放在tye
try-catch
之后。-1要复制Python
try-catch-else
构造的语义,不应使用finally块,因为即使
try
块中存在
return
或未捕获的异常,也会执行finally块。只要把
if(success)
块放在
try catch
后面就行了。谢谢@augurar-我在其他网站上玩过并重新阅读了文档,你确实是对的。我认为这应该是公认的答案。