2012-02-16 5 views
11

Мне интересно, может ли try..catch заставить выполнение зайти в catch и запустить код там?Как я могу принудительно выполнить блок захвата?

здесь пример кода:

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

Вы имеете в виду, как повышение исключения в заявлении еще? Конечно. Это не лучший способ разработки вашего приложения, но это возможно.Просто сделайте Throw new Exception («Это простое исключение»); – IAmTimCorey

+3

'throw new Exception (« Some Message »)' –

+2

Вы можете сделать исключение в своем другом, но вы не должны использовать исключения для потока управления. – cadrell0

ответ

21

Вместо того, чтобы бросать исключение, в else, я рекомендовал бы извлекая код из catch в метод и называют, что из вашего еще

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

, по-моему, я по-прежнему предпочитаю 'throw new Exception', так как могут быть некоторые коды ниже' if ... else ... ', которые я не хочу выполнять при каждом появлении ошибки – Jacky

+0

@Jacky Если код, который вы не хотите выполнять, когда есть исключение, код должен быть в блоке try. Если вы не хотите, чтобы он выполнялся в состоянии else, почему это не так, если? – cadrell0

+0

Давайте посмотрим мой пример https://dotnetfiddle.net/EN1Wd2 Я не хочу, чтобы код работал в строке 18, потому что вся моя функция 'try ... catch ...' может содержать несколько 'if ... еще ... ' – Jacky

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

     //run some code here... 

    } 

Но как Yuck заявил, что я не рекомендовал бы это. Вы должны сделать шаг назад на свой дизайн и то, что вы хотите выполнить. Это лучший способ сделать это (т. Е. С нормальным условным потоком, а не с обработкой исключений).

+0

+1 Как это * делает * ответ на вопрос о том, как вы собираетесь это делать. Как вы уже упоминали, для контроля потока это плохая практика. Редко бывает, что вам нужно будет выбросить исключение, которое будет поймано одной и той же конструкцией 'try..catch'. – Yuck

1

Да, если вы throw исключение, которое вы намерены сделать в рамках попытки, оно будет поймано в разделе catch.

Я должен спросить вас, почему вы хотите это сделать? Обработка исключений не предназначена для замены потока управления.

0

Вы могли бы бросить исключение, чтобы заставить поймать

throw new Exception(...); 
0

почему ты ловила исключение? Почему бы просто не запустить код в блоке «else»? Если вы должны сделать это таким образом, просто выбросить исключение нового

throw new Exception(); 
6

Да, вы должны бросить исключение:

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

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

Хотя это технически не лучший способ сделать то, что должен делать OP, это простое решение вопроса, заданного OP. –

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 

последний экземпляр, если происходит ошибка, то улов будет выполняться, но НЕ alwaysDoThis();. Конечно, вы все равно можете иметь несколько catch, как всегда.

+0

Вопрос требует, чтобы код запускался только в том случае, если AnyConditionTrue является ложным или генерируется исключение. Наконец, будет выполняться, даже если AnyConditionTrue истинно, и исключение не будет выбрано. Вы можете добавить if для проверки AnyConditionTrue false, но это не удовлетворяет AnyConditionTrue, и это исключение. – cadrell0

+0

Я конечно, если вы вытащите вилку питания, у вас будет неизвестное состояние исполнения. –

+0

@ cadrell0 - да, понял, просто добавив этот пример в случае, если эта проблема решает проблему - что НЕ должно выполнять управление потоком таким образом, но сделайте это так, как описано выше, если оно ИСТИНО условие ошибки, а не просто управление потоком, это может быть уместным. –

1

Как сказал cadrel, но пройти через Exception, чтобы обеспечить более обратной связи, который будет показан в 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) {} 
Смежные вопросы