我如何标记和突破捕获块?

How can I label and break out of a catch block?

我的代码中有一个 try...catch 结构:

try {
    // Some code.
} catch (Exception e) {
    if (condition) {
        // Break out of catch block.
    }
    // Continue catch block.
}

我如何标记我的 catch 块,以便我可以写 break LABEL_NAME; 代替 // Break out of catch block.,以便执行将完全退出 try...catch 构造?

尝试次数

我希望能够在 catch 关键字之前放置一个标签:

try { }
LBL: catch(Exception e) { }

因为在许多其他语言结构(例如 LBL: if(...LBL: for(...)中标签会出现在关键字之前,但这会引发语法错误。

我也无法将标签放在 catch(Exception e) 代码之后。

编辑

这个问题纯粹是出于对 如何 在 Java 中完成此任务的好奇。我非常清楚还有其他方法可以控制代码块中的执行流程。

如果我曾经遇到 标记为 catch 或一些类似块的代码,并且使用该标签从块中断开,我会想确切地知道代码在做什么以及它是如何做的。

我对评论中关于是否应该使用标签的争论的立场:我的立场是不惜一切代价避免,除非有更糟糕的选择。

在这种情况下,反转条件似乎最简单:

try {
    // Some code.
} catch (Exception e) {
    if (!condition) {
      // Continue catch block.
    }
}

假设 Continue catch block 代码不是很大(这本身就是不受欢迎的),这似乎比涉及标签更好。


作为 的替代方法,虽然您不能标记 catch(因为它不是语句),但您可以在 catch 中定义标记块(因为一个块是一个语句):

    try {
      // Some code.
    } catch(Exception e) {
      LABEL:
      {
        if (condition) {
          break LABEL;
        }
        // Remaining code.
      }
    }

这很恶心,但优点是标签更接近中断(例如,如果“// Some code”很长,可能不清楚您要中断什么)。

但是,如果您要在此处引入额外的缩进级别,您也可以将其用于 if (!condition)

最好的方法是将代码放在一个函数中,比如说 foo。这总是比在 catch 块中使用另一个 try-catch 更好的选择。

public void foo(Boolean condition){
   try {
        // Some code.
       } catch (Exception e) {
          if (condition) {
             // Break out of catch block.
             return; 
          }
         // Continue catch block.
     }
}

如果在try之后或之前有任何代码:

public void bar(){
  // your code
  foo(codition);
  // your code.
}

要突破 catch,需要标记 try

LABEL: try {
   // Some code.
} catch(Exception e) {
   if(condition) {
      break LABEL;
   }
   // Remaining code.
}

同样,我确信有很多更好的替代代码,但这回答了问题的明确要求。