Конкретный пример из приложения CAD / CAM.
Путь резания будет выполняться с помощью конструктора. Это серия линий и дуг, определяющих путь к разрезанию. Хотя ряд строк и дуг может быть разным и иметь разные координаты, он легко обрабатывается путем передачи списка в конструктор.
Форма будет производиться с использованием фабрики. Потому что, хотя есть класс формы, каждая фигура будет настраиваться по-разному в зависимости от того, какой тип формы он имеет. Мы не знаем, какую форму мы собираемся инициализировать, пока пользователь не сделает выбор.
Принятие процесс не завершается резко (или зависает, конечно), наконец, блок будет всегда выполняться.
, Если существует не наконец блок, исключение из блока выгоды будет просто подброшено стек. Обратите внимание, что исходное исключение, которое заставило блок выгоды выполняться во-первых, будет эффективно потеряно.
Исключения из-за переполнения стека
Как 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.
Наконец блок будет всегда выполняться. Если Вы исключите наконец блок, и исключение происходит в блоке выгоды, то никакой код после блока выгоды не выполнится, потому что по существу Вы - блок выгоды, приведет к сбою и генерирует само необработанное исключение.
Да наконец будет всегда выполняться
No код после того, как блок выгоды не будет выполнен.
Даже с наконец блоком любой код после наконец блок не будет работать.
Если будет исключение в блоке выгоды, то наконец выполнится, но новое исключение будет выдано. Блок выгоды, в котором произошло исключение, не поймает исключение, это продолжит стек.
извлеченный Урок: не делайте материала в блоке выгоды, который может бросить, если можно помочь ему; если Вы должны, вложить блок попытки/выгоды.
try
{
}
catch()
{
try
{
// code fails here
}
catch
{
// handle that. Or not.
}
}
finally
{
}
Наконец блок будет всегда выполняться. От 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 . . .
Если бы исключение происходит в блоке выгоды, весь код в наконец был бы все еще выполнен. Если будет обработчик исключений выше в стеке (например, вызывающая сторона этой функции), то это поймает это исключение. Еще результат в необработанном исключении и снижает Ваше приложение.
код после того, как точку исключения в блоке выгоды не назовут.