В.NET, что, если что-то перестало работать в блоке выгоды, будут наконец всегда называть?

Конкретный пример из приложения CAD / CAM.

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

Форма будет производиться с использованием фабрики. Потому что, хотя есть класс формы, каждая фигура будет настраиваться по-разному в зависимости от того, какой тип формы он имеет. Мы не знаем, какую форму мы собираемся инициализировать, пока пользователь не сделает выбор.

16
задан Blair Conrad 24 February 2009 в 15:06
поделиться

6 ответов

Принятие процесс не завершается резко (или зависает, конечно), наконец, блок будет всегда выполняться.

, Если существует не наконец блок, исключение из блока выгоды будет просто подброшено стек. Обратите внимание, что исходное исключение, которое заставило блок выгоды выполняться во-первых, будет эффективно потеряно.

Исключения из-за переполнения стека

Как Jared отметили, переполнение стека заставит наконец блок не выполняться. Я полагаю, что это завершает программу резко, но я мог быть неправым. Вот пример кода:

using System;

public class Test
{    
    static void Main()
    {
        // Give the stack something to munch on
        int x = 10;
        try
        {
            Main();
            Console.WriteLine(x);
        }
        finally
        {
            Console.WriteLine("Finally");
        }
    }  
}

Результаты:

Процесс завершается из-за StackOverflowException.

25
ответ дан 30 November 2019 в 16:14
поделиться

Наконец блок будет всегда выполняться. Если Вы исключите наконец блок, и исключение происходит в блоке выгоды, то никакой код после блока выгоды не выполнится, потому что по существу Вы - блок выгоды, приведет к сбою и генерирует само необработанное исключение.

6
ответ дан 30 November 2019 в 16:14
поделиться

Да наконец будет всегда выполняться

No код после того, как блок выгоды не будет выполнен.

Даже с наконец блоком любой код после наконец блок не будет работать.

6
ответ дан 30 November 2019 в 16:14
поделиться

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

извлеченный Урок: не делайте материала в блоке выгоды, который может бросить, если можно помочь ему; если Вы должны, вложить блок попытки/выгоды.

try
{

}
catch()
{
  try
  {
    // code fails here
  }
  catch
  {
    // handle that. Or not. 
  }
}
finally
{ 

}
4
ответ дан 30 November 2019 в 16:14
поделиться

Наконец блок будет всегда выполняться. От MSDN:

наконец блок полезен для чистки любых ресурсов, выделенных в блоке попытки, а также выполнении любого кода, который должен выполниться, даже если существует исключение. Управление всегда передается к наконец блок независимо от того, как блок попытки выходит.

принимая во внимание, что выгода используется для обрабатывания исключений, которые происходят в блоке операторов, наконец используется, чтобы гарантировать, что блок операторов кода выполняется независимо от того, как из предыдущего блока попытки выходят.

Между прочим, это - тип вопроса, который можно легко протестировать сами путем написания некоторого кода, компиляции его и наблюдения того, что происходит, когда Вы выполняете его.

class Program {
    static void Main(string[] args) {
        try {
            Console.WriteLine("Trying!");
            throw new Exception();
        }
        catch (Exception e) {
            Console.WriteLine("Catching {0}!", e.Message);
            throw new Exception();
        }
        finally {
            Console.WriteLine("Finally!");
        }
    }
}

Это производит:

Trying!
Catching Exception of type 'System.Exception' was thrown.!

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at TestFinally.Program.Main(String[] args) in C:\Documents and Settings\Me\My
Documents\Visual Studio 2008\Projects\TestFinally\TestFinally\Program.cs:line 15
Finally!
Press any key to continue . . .

1
ответ дан 30 November 2019 в 16:14
поделиться

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

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

0
ответ дан 30 November 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: