.Net Исключение выглядывает. (Обновление) - PullRequest
1 голос
/ 06 мая 2009

1001 * попробовать * {
бросить новое исключение («тест»);
}
наконец
{
// Проверяем исключение ????
// Log (Exception);
}

Есть ли способ получить исключение из среды выполнения в finally?
Я не могу использовать улов: -)

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

using(CriticalFlow(policy))  
{  
   //Not my code.  
   flow.Succeeded();  
}  

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

Еще раз спасибо.

Ответы [ 7 ]

7 голосов
/ 06 мая 2009
Exception helper;

try
{

}
catch (Exception ex)
{
    helper = ex;
}
finally
{
   if (helper != null)
   {
      process helper
   }
}
4 голосов
/ 06 мая 2009

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

try
{
    // some exception is thrown
}
catch (Exception ex)
{
    // do some logging or so
    throw;
}
2 голосов
/ 06 мая 2009

Нет, вы не можете. Если вы можете изменить оставшуюся часть кода, вы можете написать:

Exception e = null;
try
{
    e = new Exception("test");
    throw e;
}
finally
{
    // Examine e
}

но вы не можете ничего сделать "нормально".

Не могли бы вы обернуть все это в метод логирования? Здесь могут быть полезны делегаты, например,

LogExceptions(delegate
    {
        try
        {
            throw new Exception("test"0;
        }
        finally
        {
            // Not logged yet
        }
    }
);

Где LogExceptions просто попробует указанное действие, перехватит все исключения, зарегистрирует их и сбросит.

0 голосов
/ 06 мая 2009

Этот код может прояснить наше намерение:

using (CriticalFlow cf = new CriticalFlow())
            {
                // code which can throws
                cf.Completed();
            }

public class CriticalFlow : IDisposable
    {
        private bool _completed = false;

        public void Completed()
        {
            this._completed = true;
        }

        #region IDisposable Members

        public void Dispose()
        {
            if (this._completed == false)
            {
               // can i peek the exception at this point?
            }
        }

        #endregion
    }
0 голосов
/ 06 мая 2009

Нет, вы не можете напрямую получить доступ к объекту исключения в блоке finally. Однако вы можете перехватить исключение в блоке catch, сохранить его в локальной переменной и затем перебросить его с помощью оператора throw;.

0 голосов
/ 06 мая 2009

Извините, но это невозможно ...

0 голосов
/ 06 мая 2009

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

Почему вы не можете использовать catch? :? Вы можете поймать исключение, если хотите, чтобы сделать с ним, и повторно выбросить его, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...