Try / Catch - вернуться к оригинальной попытке - PullRequest
3 голосов
/ 14 апреля 2011

Давайте посмотрим на этот простой пример try / catch ...

try
{
    // User inputs path of a file
    if(!ValidPath)
        throw new InvalidPathException();
}
catch InvalidPathException e
{
    // Log error
    // Re-throw the error.
    throw;     
}

Пара вопросов.Оба, вероятно, простые ответы.

  1. Возвращается ли бросок в улове и проверяется следующий улов, а затем следующий и т. Д.?
  2. Есть ли способ пойтивернуться к первоначальной попытке?Или это плохая практика программирования?

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011
  1. Да, оператор throw в блоке catch будет повторно перехвачен любым блоком-оберткой / следующим блоком catch.

  2. Это плохая практика программирования для измененияпоток программы использует Basic Goto: операторы like, поэтому не рекомендуется возвращаться обратно в исходный кодовый блок (что также было бы непрактично).Также вы всегда пытаетесь обработать исключения, близкие к тому, где они возникают, поскольку вывод отладчика и трассировка стека будут намного более информативными.

1 голос
/ 14 апреля 2011

Каждый блок попытки может иметь несколько уловов, но будет использоваться только один. Это поймает самое близкое исключение. Если вы затем сгенерируете исключение, он полностью покинет этот блок попытки, и только окружающий улов сможет обработать повторно выброшенное исключение.

0 голосов
/ 08 декабря 2011
var anyway = true;
while(anyway)
{
try
{
do somthing
...
...
...
if no errors anyway = false
}
catch
{
   somthing wrong!
}
}

;)

0 голосов
/ 14 апреля 2011
  1. Возвращается ли бросок в улове и проверяется следующий улов, а затем следующий и т. Д.

    Ответ: Нет, это не так.Только перехват блока.

  2. Есть ли способ вернуться к первоначальной попытке?Или это плохая практика программирования?

    Ответ: Да, несколько разных тактик / хаков.

Ссылка 1: Попробуйте перехватить каждую строку кода без отдельных блоков перехвата

Пример:

public delegate void VoidDelegate();

public static class Utils
{
  public static void Try(VoidDelegate v) {
    try {
      v();
    }
    catch {}
  }
}

Utils.Try( () => WidgetMaker.SetAlignment(57) );
Utils.Try( () => arrayname["Title"] = txtTitle.Text );
Utils.Try( () => objectname.Season(true, false) );
Utils.Try( () => (Session["CasseroleTracker"]).Seasoned = true );

другим способом является использование GOTO statement:

Ref 2: http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/2294d2ce-e6ae-4152-b022-61aa2ae9372d/

Другой способ - с On Error Resume Next

Ref 3: http://msdn.microsoft.com/en-us/library/5hsw66as.aspx

0 голосов
/ 14 апреля 2011

1. Возвращается ли бросок в улове и проверяется следующий улов, а затем следующий и т. Д.для любой попытки блока будет выбран.Если блок catch перебрасывает исключение, то он распространяется до внешнего блока try / catch, если таковой имеется, или до стека вызовов до любых других блоков try / catch в стеке вызовов.(Он не будет перехвачен другим блоком catch в том же блоке try / catch.)

2. Есть ли способ вернуться к исходной попытке?Или это плохая практика программирования?

В C # вы не можете вернуться в место, где было сгенерировано исключение, если вы об этом и просите.Если вы хотите снова выполнить весь блок try, просто поместите его в цикл.Это требует, чтобы вы не перебрасывали исключение, потому что это отправило бы выполнение из метода.

См. Ответ на этот вопрос для примера повторной попытки блока try.

...