Как я могу принудительно выполнить казнь в блоке уловов? - PullRequest
19 голосов
/ 16 февраля 2012

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

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

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

Ответы [ 12 ]

27 голосов
/ 16 февраля 2012

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

try
{
    if (AnyConditionTrue)
    {
        MethodWhenTrue();
    }
    else
    {
        HandleError();
    }
}
catch(Exception ex)
{
    HandleError();
}
22 голосов
/ 16 февраля 2012
   try{
      if (AnyConditionTrue){
              //run some code
               }
      else{
              throw new Exception();
          }
   }
   catch(){

      //run some code here...

   }

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

10 голосов
/ 16 февраля 2012

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

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

     //run some code here...
  }
2 голосов
/ 08 января 2019

Эффективный способ бросить Exception, а также перейти к Catch следующим образом:

try
{
   throw new Exception("Exception Message");
}
catch (Exception e)
{
   // after the throw, you will land here
}
2 голосов
/ 28 марта 2016
if(conditiontrue)
{

}
else{
    throw new Exception();
}
1 голос
/ 09 ноября 2018
public class CustomException: Exception
{
     public CustomException(string message)
        : base(message) { }

}

//

if(something == anything)
{
   throw new CustomException(" custom text message");
}

Вы можете попробовать это

1 голос
/ 14 мая 2016

Если вы хотите «форсировать» попытку, просто нарочно сделайте что-нибудь глупое, как это:

List<string> cc = null;
foreach (string c in cc) {}
1 голос
/ 04 июня 2015

Как сказал Кадрэл, но пройти через Исключение, чтобы предоставить больше отзывов, что будет показано во внутреннем Исключении:

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);
}
1 голос
/ 16 февраля 2012

Я думаю, что вы хотите, это 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

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

1 голос
/ 16 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...