2012-02-16 65 views
11

我想知道try..catch強制執行進入catch並在那裏運行代碼?如何強制執行到捕獲塊?

這裏的示例代碼:

try { 
    if (AnyConditionTrue) { 
     // run some code 
    } 
    else { 
     // go catch 
    } 
} catch (Exception) { 
    // run some code here... 
} 
+1

你是說像else語句引發異常?當然。這不是設計應用程序的最佳方式,但它是可能的。只要做一個拋出新的異常(「這是一個簡單的例外」); – IAmTimCorey 2012-02-16 13:48:59

+3

'拋出新的異常(「Some Message」)' – 2012-02-16 13:49:04

+2

你可以在其他人中拋出一個異常,但不應該使用異常來控制流。 – cadrell0 2012-02-16 13:49:47

回答

21

而不是else拋出異常,我會建議您catch提取代碼到一個方法,並調用從您的其他

try 
{ 
    if (AnyConditionTrue) 
    { 
     MethodWhenTrue(); 
    } 
    else 
    { 
     HandleError(); 
    } 
} 
catch(Exception ex) 
{ 
    HandleError(); 
} 
+1

在我看來,我仍然更喜歡'拋出新的異常',因爲可能有一些代碼在下面'if ... else ...',我不想執行它們,只要錯誤出現 – Jacky 2015-12-08 10:15:53

+0

@Jacky如果有代碼在發生異常時不想執行,代碼應該放在try塊中。如果你不希望它在else條件下執行,爲什麼它不在if中? – cadrell0 2015-12-11 14:04:18

+0

讓我們看看我的示例https://dotnetfiddle.net/EN1Wd2我不想讓代碼運行到第18行,因爲我的整個函數try ... catch ...可能包含多個if ...否則...' – Jacky 2015-12-12 18:56:31

20
try{ 
     if (AnyConditionTrue){ 
       //run some code 
       } 
     else{ 
       throw new Exception(); 
      } 
    } 
    catch(){ 

     //run some code here... 

    } 

但像呸曾表示,我不會推薦。你應該退一步看看你的設計和你想要完成的事情。有一個更好的方法來做到這一點(即使用正常的條件流而不是異常處理)。

+0

+1正如它*確實*回答了你如何去做這件事的問題。正如你所提到的,對於控制流來說,這是不好的做法。很少有您需要拋出異常以被同樣的'try..catch'構造捕獲。 – Yuck 2012-02-16 13:52:25

1

是的,如果你throw例外,你打算catch從try中,它將被捕獲部分捕獲。我不得不問你爲什麼要這麼做?異常處理並不意味着替代控制流。

0

你可以拋出一個異常給力抓

throw new Exception(...); 
0

爲什麼你捕獲異常?爲什麼不直接在你的「其他」塊中運行代碼?如果必須這樣做的,只是拋出一個新的異常

throw new Exception(); 
6

是的,你不得不放棄例外:

try 
    { 
    throw new Exception("hello"); 
    } 
    catch (Exception) 
    { 

    //run some code here... 
    } 
+1

雖然這在技術上不是做OP所需要做的最好的方法,但它是OP提出的問題的簡單解決方案。 – 2013-12-11 10:22:52

1

我想你想要的是一個finally塊:http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx

看到這個

try 
{ 
    doSomething(); 
} 
catch 
{ 
    catchSomething(); 
    throw an error 
} 
finally 
{ 
    alwaysDoThis(); 
} 

這是不同的如果/當你這樣做:

try 
{ 
    doSomething(); 
} 
catch 
{ 
    catchSomething(); 
    throw an error 
} 
    alwaysDoThis();// will not run on error (in the catch) condition 

這最後一個實例,如果發生錯誤,catch會執行但不是alwaysDoThis();。當然,您仍然可以一如既往地擁有多個catch

+0

只有在AnyConditionTrue爲false或拋出異常的情況下,該問題纔會使代碼運行。即使AnyConditionTrue爲真,並且不會引發異常,終端仍將運行。你可以添加一個if來檢查AnyConditionTrue false,但是這不會滿足AnyConditionTrue是真的,並拋出一個異常。 – cadrell0 2012-02-16 13:56:13

+0

我當然如果你拔掉電源插頭,你有一個未知的執行狀態。 – 2012-02-16 14:02:22

+0

@ cadrell0 - 是的,理解,只是增加這個例子,以解決問題的情況下 - 這不是做流量控制這種方式,但做的方式描述如果它是真實的錯誤條件,而不是簡單的流量控制這可能適當。 – 2012-02-16 14:05:40

1

正如cadrel說,但通過一個例外,以提供更多的反饋,這將在InnerException所示::

try 
{ 
    if (AnyConditionTrue) 
    { 
     MethodWhenTrue(); 
    } 
    else 
    { 
     HandleError(new Exception("AnyCondition is not true")); 
    } 
} 
catch (Exception ex) 
{ 
    HandleError(ex); 
} 

...

private void HandleError(Exception ex) { 
    throw new ApplicationException("Failure!", ex); 
} 
0
if(conditiontrue) 
{ 

} 
else{ 
    throw new Exception(); 
} 
1

如果你想「逼」一試捕,只是故意做一些愚蠢的,就像這樣:

List<string> cc = null; 
foreach (string c in cc) {}