我想知道try..catch
強制執行進入catch
並在那裏運行代碼?如何強制執行到捕獲塊?
這裏的示例代碼:
try {
if (AnyConditionTrue) {
// run some code
}
else {
// go catch
}
} catch (Exception) {
// run some code here...
}
我想知道try..catch
強制執行進入catch
並在那裏運行代碼?如何強制執行到捕獲塊?
這裏的示例代碼:
try {
if (AnyConditionTrue) {
// run some code
}
else {
// go catch
}
} catch (Exception) {
// run some code here...
}
而不是else
拋出異常,我會建議您catch
提取代碼到一個方法,並調用從您的其他
try
{
if (AnyConditionTrue)
{
MethodWhenTrue();
}
else
{
HandleError();
}
}
catch(Exception ex)
{
HandleError();
}
在我看來,我仍然更喜歡'拋出新的異常',因爲可能有一些代碼在下面'if ... else ...',我不想執行它們,只要錯誤出現 – Jacky 2015-12-08 10:15:53
@Jacky如果有代碼在發生異常時不想執行,代碼應該放在try塊中。如果你不希望它在else條件下執行,爲什麼它不在if中? – cadrell0 2015-12-11 14:04:18
讓我們看看我的示例https://dotnetfiddle.net/EN1Wd2我不想讓代碼運行到第18行,因爲我的整個函數try ... catch ...可能包含多個if ...否則...' – Jacky 2015-12-12 18:56:31
try{
if (AnyConditionTrue){
//run some code
}
else{
throw new Exception();
}
}
catch(){
//run some code here...
}
但像呸曾表示,我不會推薦。你應該退一步看看你的設計和你想要完成的事情。有一個更好的方法來做到這一點(即使用正常的條件流而不是異常處理)。
+1正如它*確實*回答了你如何去做這件事的問題。正如你所提到的,對於控制流來說,這是不好的做法。很少有您需要拋出異常以被同樣的'try..catch'構造捕獲。 – Yuck 2012-02-16 13:52:25
是的,如果你throw
例外,你打算catch
從try中,它將被捕獲部分捕獲。我不得不問你爲什麼要這麼做?異常處理並不意味着替代控制流。
你可以拋出一個異常給力抓
throw new Exception(...);
爲什麼你捕獲異常?爲什麼不直接在你的「其他」塊中運行代碼?如果必須這樣做的,只是拋出一個新的異常
throw new Exception();
是的,你不得不放棄例外:
try
{
throw new Exception("hello");
}
catch (Exception)
{
//run some code here...
}
雖然這在技術上不是做OP所需要做的最好的方法,但它是OP提出的問題的簡單解決方案。 – 2013-12-11 10:22:52
我想你想要的是一個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
。
只有在AnyConditionTrue爲false或拋出異常的情況下,該問題纔會使代碼運行。即使AnyConditionTrue爲真,並且不會引發異常,終端仍將運行。你可以添加一個if來檢查AnyConditionTrue false,但是這不會滿足AnyConditionTrue是真的,並拋出一個異常。 – cadrell0 2012-02-16 13:56:13
我當然如果你拔掉電源插頭,你有一個未知的執行狀態。 – 2012-02-16 14:02:22
@ cadrell0 - 是的,理解,只是增加這個例子,以解決問題的情況下 - 這不是做流量控制這種方式,但做的方式描述如果它是真實的錯誤條件,而不是簡單的流量控制這可能適當。 – 2012-02-16 14:05:40
正如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);
}
if(conditiontrue)
{
}
else{
throw new Exception();
}
如果你想「逼」一試捕,只是故意做一些愚蠢的,就像這樣:
List<string> cc = null;
foreach (string c in cc) {}
你是說像else語句引發異常?當然。這不是設計應用程序的最佳方式,但它是可能的。只要做一個拋出新的異常(「這是一個簡單的例外」); – IAmTimCorey 2012-02-16 13:48:59
'拋出新的異常(「Some Message」)' – 2012-02-16 13:49:04
你可以在其他人中拋出一個異常,但不應該使用異常來控制流。 – cadrell0 2012-02-16 13:49:47