0

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

public class Program 
    { 
     static void Main() 
     { 
      int i = 123; 
      string s = "Some string"; 
      object obj = s; 

      try 
      { 
       // Invalid conversion; 
       i = (int)obj; 

       // The following statement is not run. 
       Console.WriteLine("WriteLine at the end of the try block."); 
      } 
      finally 
      { 
       Console.WriteLine("\n Finally Block executed !!!"); 
      } 
     } 
    } 

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

+0

Как вы можете видеть из [этого скрипку] (https://dotnetfiddle.net/wf8DN9), это не так. Предоставьте [mcve], демонстрирующий вашу проблему. –

+0

Да, это будет работать на dotnetfiddle, но пока я запускал его на visual studio 2013, он выдает следующее исключение, не передавая управление, наконец, блокировать сначала, как в вашем случае. Необработанное исключение: System.InvalidCastException: Указанный приведение недействительно. at exceptionHandling.Program.Main() в c: \ Users \ Kifayat \ Desktop \ Learn \ excepti onHandling \ exceptionHandling \ Program.cs: строка 69 –

+2

Он все равно выполнит его. То, что вы, вероятно, видите, это то, что Visual Studio разбивается на непослушные исключения, которые будут выполняться до того, как будет выполнен блок finally. Еще раз нажмите «Выполнить», и блок finally будет выполнен. –

ответ

0

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

Ref: https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

Чтобы проверить это, я попробовал ваш образец, как это и казнили, наконец, блок. Попробуйте это:

public class MainClass { 
public static void Main() 
{ 
    try { 
     Invalid(); 
    } 
    catch (Exception ext) { 
     Console.Write(ext.Message); 
    } 
} 

public static void Invalid() 
{ 
    string message = "new string"; 
    object o = message; 
    try 
    { 
     int i = (int)o; 
    } 
    finally 
    { 
     Console.WriteLine("In finally"); 
    } 
} 
} 
+0

Нет необходимости в решении. Блок finally будет * всегда * выполняться. –