最后尝试捕获:如果没有抛出异常,请执行一些操作

时间:2012-05-03 12:30:17

标签: c# try-catch

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

我能想出的最好的是:

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

有更好的方法吗?

7 个答案:

答案 0 :(得分:45)

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

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

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

如果你想恢复旧的行为,你也可以使用这个不需要finally的变体只是为了编写“if no exceptions”条件:

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
}

答案 1 :(得分:5)

你可以构造你的代码doSomething是块中的最后一个语句并且它不会抛出吗?

bool exception = false;
try{
  // something
  doSomething();
} catch {
}
finally {
}

答案 2 :(得分:4)

您不需要finally子句。

解决方案:

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

通常你只需要在catch子句中返回一个,这样你甚至不必测试:

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

或(取决于用例,通常不太清楚,特别是如果您预期有多个例外 - 您不希望尝试捕获imbrications ......):

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

没有 - 你所拥有的可能是用C#做的最佳方式。

这是假设:

  • 您不希望“我可以在此处执行我想要的”代码在try块的底部运行。 (也许是因为您不希望代码中的异常由主catch块处理。)
  • 您不希望“我可以做我想要的”代码完全在try...catch...finally结构之外运行。 (也许是因为您希望代码在finally块内的其他代码之前运行。)

答案 5 :(得分:1)

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

try {
    ...
    // No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
    ...
}

答案 6 :(得分: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
}

虽然这通常被认为是不好的做法,但我比旗帜版更喜欢它。