2010-04-30 74 views
11

我有例如在我的方法使用try/catch后:退出的try/catch防止代码从正在运行

} 
    catch (OurCustomExceptionObject1 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 1"; 
    } 
    catch(OurCustomExceptionObject2 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 2"; 
    } 
    catch (OurCustomExceptionObject3 ex) 
    { 
     txtErrorMessage.InnerHtml = "test 3"; 
    } 

    ... rest of code here is being executed after the try/catch 

我不想的代码的其余部分是否有任何异常运行被抓到。我正在处理例外。我听说不使用退出尝试出于某种原因。这是真的吗,这样做不好吗?这是否正确地停止catch语句之后的代码执行?

+1

Exit Try只存在于VB.NET中。它不适用于C#。在C#中,相应的语言特性将是'break',但在try..catch..finally块中这是非法的。接下来最好的事情就是“返回”,这种做法并不一样,但是完全合法。 – stakx 2010-04-30 22:01:21

+0

@stakx'break'在'catch'块中不是非法的。它可以用来摆脱循环。 – 2015-06-02 08:00:09

回答

30

catch-block中的return,重新抛出异常,或从try-block内的try-block下面移动代码。

+0

准确地说,我要回答 – BlitzKrieg 2010-04-30 21:58:38

+2

是的。我认为在这种情况下移动代码是最好的方法。如果你想在发生异常时停止代码 - 不要做任何事情。异常已经中断了执行流程。如果你想处理这个操作,只需用try-catch来包围整个事物。虽然如果它是一种方法,我会围绕方法调用而不是方法体,所以异常不会被无意地吞噬。 – 2010-04-30 23:49:16

+0

是的,这是真的。但在我的情况下,其余的代码如此之多。在try语句中放置大量代码是可以的吗?因为那部分中的每个捕获物最终都会被抓到一个捕获物中,例如我将无法将哪个例外引用到哪里。 – Disasterkid 2013-01-16 08:48:02

1

两个选项立刻浮现在脑海:

  1. return从每个catch内直(如BlueRaja建议)
  2. 设置标志(例如,errorOccurred)的catch块中的例外,你不要允许,然后把if (errorOccurred) return;整个try/catch块

后者威力更意图后dable给其他开发者,因为很容易浏览一下catch里面发生的事情,找出事后发生的事情。看到一个公然的if (errorOccurred) return;使人们很难误解发生了什么。

1

从高层次看,我认为如果你的代码试图做一些可能失败的事情,那么这可能会违反(至少)单一责任原则,然后继续做更​​多的事情。

一个答案的缘故不过,如果你想要做一个黑客(这总是不好的,所以不要),你可以做

bool success = true; 
try 
{ 
    // the good ol' college try 
} 
catch (...) 
{ 
    success = false; 
} 

if (success) 
{ 
    // do the rest of your stuff 
} 

编辑:或者称为BlueRaja建议,将的所有代码放入try块。如果第一位失败,则失败。其余的代码无法运行。

+0

我不知道。这一切都取决于需要发生的情况和逻辑。我不明白为什么后面的处理会伤害任何东西,如果你正在做的所有处理预期错误的方法都是在捕获后记录并移到方法中的下一个代码。 – PositiveGuy 2010-05-01 02:47:13