vishal_h Ответов: 4

Почему C# не позволяет возвращать значение из блока finally


Почему при попытке вернуть значение из блока Finally вы получите ошибку "Control cannot leave the body of a finally clause
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine( f1());
Console.ReadKey();
}


static int f1()
{
try
{
return 10;
}
finally
{
return 5; // This is where Error occurs
}
}
}
}

BillWoodruff

Есть много вопросов" почему " о том, как все работает в .NET, на которые можно ответить только с помощью утверждения: потому что язык был разработан таким образом.

Я хотел бы предложить вам сосредоточиться на понимании структуры try/catch/finally как "целого", а не на ее "кусочках". Нет никакого смысла использовать try/finally без "улова"." Понимание того, как бросить свое собственное исключение (в "улове"), и понимание того, что такое исключения, очень важно. твое здоровье, Билл

4 Ответов

Рейтинг:
1

Hemant Singh Rautela

Вы должны написать код как :

Просто простой код для возврата значения с помощью блока finally... Как окончательно использованные для очистки ресурсы...
если возникнет какая-либо ошибка, то catch выполнит ее и установит возвращаемое значение...


public  bool func_a()
   {
     bool bFlag = true;
     try
        {
          SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
          con.Open();
         // do whatever...
           bFlag = true;
        }
        catch (Exception ex)
        {
            bFlag = false;
        }
        finally
        {
            con.Close();
        }
        return bFlag;


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

И поскольку блок finally всегда будет выполнять любое условие ошибка возникает или нет Таким образом, мы не можем поместить два оператора возврата в поток... как вы использовали в блоке try, а затем в блоке finally.(если ошибка не произошла, то ваш код try будет выполнен тогда finally..so как может работать два оператора return... )

--------------
Это ошибка времени компиляции для оператора break, continue или goto для передачи управления из блока finally. Когда оператор break, continue или goto возникает в блоке finally, цель оператора должна находиться в том же блоке finally, иначе возникает ошибка времени компиляции.
От :
http://msdn.microsoft.com/en-us/library/aa664733%28v=vs.71%29.aspx[^]
:-)


Suvabrata Roy

Сначала прочтите вопрос, а затем ответьте, что он/она спросил, почему и как.

Hemant Singh Rautela

Я сделал и то, и другое....: -) просто прочитал полный ответ (как, наконец, используется для очистки ресурсов)
и дайте ему решение, как это будет работать...

да, я пропустил еще одну строчку Для и наконец : "как, наконец, используемая для очистки ресурсов, поэтому управление не может выйти без его завершения.. "
Я его обновлю...

Suvabrata Roy

1. это обычная практика открывать соединение при написании какой-либо функции?
2. Перед использованием любой переменной в блоке Finally проверьте ее ссылку или значение, возможно, переменная не будет инициализирована.

BillWoodruff

Я думаю, что этот ответ заслуживает #4: автор показывает пример кода с использованием try/catch, и объяснение является разумным.

Hemant Singh Rautela

Проголосуйте за него с 5... :-) (Я не открывал эту ссылку)

BillWoodruff

Если вы не скажете мне, как голосовать, я не скажу вам, как думать :) Голос № 4-это очень хороший голос !

Hemant Singh Rautela

ОПС моя ошибка ! извините, что я не прочитал ваш комментарий должным образом.. Я просто подумал, что вы предлагаете мне решение 4-более подходящий ответ...
И спасибо за то, что проголосовали за меня независимо от того, как много в цифрах (так как я с удовольствием принимаю все 1-5 голосов...)

BillWoodruff

Кой бат нахин :)

Hemant Singh Rautela

:-)

Рейтинг:
0

Suvabrata Roy

Привет,

Читайте об этом напоследок : http://msdn.microsoft.com/en-IN/library/zwc8s4fz.aspx[^]

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

Если я не написал ни одного блока Catch и возникло исключение ?

Тем не менее, наконец, блок будет выполнен, но он имеет некоторую зависимость от настроек CLR вашей машины. Для дополнительной информации : http://msdn.microsoft.com/en-us/magazine/cc793966.aspx[^]


Спасибо,
Suvabrata


Рейтинг:
0

Pravuprasad

ошибка заключается в том, что ваша функция возвращает два значения, в попробовать и в заключительный блок.для дальнейшего ЮВ
Смотрите это для вашей справки[^]


Рейтинг:
0

Gihan Liyanage

Я думаю, что здесь вы, возможно, пытаетесь использовать блок finally странным образом. В рамках документации символизирует, наконец, как следует:

The finally block is useful for cleaning up any resources allocated in the try block.


Если бы это был действительный код, каков был бы ожидаемый результат? Блок finally выполняется после первого возврата. Означает ли это, что метод всегда должен возвращать 5?