34

我想知道,如果没有抛出异常,有没有办法只执行一个块?

我能想到的最好的是:

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}finally{
    if(!exception){
        // i can do what i want here
    } 
}

有没有更好的办法?

4

7 回答 7

54

当然有:把它放在try块的底部。

try{
    // something
    // i can do what i want here
}catch(Exception e){
    // handle exception
}

这并不完全等同于您的原始代码,因为如果“您想要的”抛出,异常将在本地捕获(这不会发生在您的原始方案中)。这是您可能关心或不关心的事情,并且很有可能不同的行为也是正确的行为。

如果你想恢复旧的行为,你也可以使用这个不需要 a 的变体来finally编写“如果没有异常”条件:

var checkpointReached = false;
try{
    // something
    checkpointReached = true;
    // i can do what i want here
}catch(Exception e){
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint
    // handle exception
}
于 2012-05-03T12:31:34.247 回答
7

您不需要 finally 子句。

一个办法 :

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}
if(!exception){
     // u can do what u want here
} 

通常你会在你的 catch 子句中有一个 return ,这样你甚至不必测试:

try{
    // something
}catch(Exception e){
   // do things
   return;
}
// u can do what u want here

或(取决于用例,通常不太清楚,特别是如果您预期有多个异常 - 您不希望有 try-catch 嵌套......):

try{
    // something
    // u can do what u want here
}catch(Exception e){
   // do things
}
于 2012-05-03T12:31:42.677 回答
5

你能构造你的代码,doSomething让它是块中的最后一条语句并且它不会抛出吗?

bool exception = false;
try{
  // something
  doSomething();
} catch {
}
finally {
}
于 2012-05-03T12:32:09.290 回答
3

是的,有:把它放在 try 块的末尾:)

于 2012-05-03T12:32:33.567 回答
1

不-您所拥有的可能是在 C# 中执行此操作的最佳方法。

这是假设:

  • 您不希望“我可以在这里做我想做的事”try代码在您的块底部运行。(也许是因为您不希望该代码中的异常由主catch块处理。)
  • 您不希望“我可以在这里做我想做的事”代码完全在try...catch...finally结构之外运行。finally(也许是因为您希望该代码在位于块内的其他代码之前运行。)
于 2012-05-03T12:31:53.950 回答
1

虽然您的代码没有任何问题,但这是不必要的。只需将您希望执行的代码放在 try 块的底部:

try {
    ...
    // No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
    ...
}
于 2012-05-03T12:33:04.977 回答
0

我相信您正在尝试中寻找尝试:

try{
    // something

    try{
        // something else not interfering with first try
    } catch(Exception innerEx){
        // something else threw this innerEx
    }

}catch(Exception outerEx){
    // something threw this outerEx
}

虽然这通常被认为是不好的做法,但我更喜欢它而不是标志版本。

于 2017-04-19T22:56:51.227 回答