[.NET2] Exception + Dispose
От: Аноним  
Дата: 03.11.10 07:17
Оценка:
Куда пропадает Exception "Error in Process" в приведённом коде?

using System;

namespace ConsoleApplication5
{
    public class A : IDisposable
    {
        public void Process()
        {
            Console.WriteLine("Process - begin");
            throw new NotImplementedException("Error in Process");
        }

        public void Dispose()
        {
            Console.WriteLine("Dispose - begin");
            throw new NotImplementedException("Error in Dispose");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main1 - Begin");

            try
            {
                using (A a = new A())
                {
                    a.Process();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.ToString());
                Console.WriteLine("InnerException: " + (ex.InnerException != null ? ex.InnerException.ToString() : "<null>"));
            }

            Console.WriteLine("Main1 - End");

            Console.ReadLine();
        }
    }
}
Re: [.NET2] Exception + Dispose
От: _FRED_ Черногория
Дата: 03.11.10 07:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Куда пропадает Exception "Error in Process" в приведённом коде?


Заменяется на то, что произошло в Dispose(). Если не понятно, перепишите using через try/finally и пройдитесь отладчиком — всё будет ясно.

Вообще, бросать исклюбчения из Dispose() — порочная практика. И, в частности, как раз из-за приведённого примера.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: [.NET2] Exception + Dispose
От: Аноним  
Дата: 03.11.10 07:36
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Аноним, Вы писали:


А>>Куда пропадает Exception "Error in Process" в приведённом коде?


_FR>Заменяется на то, что произошло в Dispose(). Если не понятно, перепишите using через try/finally и пройдитесь отладчиком — всё будет ясно.


_FR>Вообще, бросать исключения из Dispose() — порочная практика. И, в частности, как раз из-за приведённого примера.


Спасибо.

А как его отловить используя using?
Разве Exception может пропасть безвозвратно не будучи обработанным?
Ясно, что если через try/finally — можно поместить прямой вызов Dispose в свой try/catch.

У меня в Dispose — закрытие "ресурсов", во время которого тоже может произойти Exception.
Re[3]: [.NET2] Exception + Dispose
От: _FRED_ Черногория
Дата: 03.11.10 07:39
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>>>Куда пропадает Exception "Error in Process" в приведённом коде?

_FR>>Заменяется на то, что произошло в Dispose(). Если не понятно, перепишите using через try/finally и пройдитесь отладчиком — всё будет ясно.
_FR>>Вообще, бросать исключения из Dispose() — порочная практика. И, в частности, как раз из-за приведённого примера.

А>А как его отловить используя using?


Написать try/catch внутри using или не бросать в Dispose().

А>Разве Exception может пропасть безвозвратно не будучи обработанным?


Может. Бросание из Dispose() — это ахтунг.

А>Ясно, что если через try/finally — можно поместить прямой вызов Dispose в свой try/catch.

А>У меня в Dispose — закрытие "ресурсов", во время которого тоже может произойти Exception.

Внутри Dispose() делать try/catch.

Что там за ресурсы такие и что там за освобождение, которое может закончиться исключением?
Help will always be given at Hogwarts to those who ask for it.
Re[4]: [.NET2] Exception + Dispose
От: Аноним  
Дата: 03.11.10 07:53
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Написать try/catch внутри using или не бросать в Dispose().


А>>Разве Exception может пропасть безвозвратно не будучи обработанным?


_FR>Может. Бросание из Dispose() — это ахтунг.


А>>Ясно, что если через try/finally — можно поместить прямой вызов Dispose в свой try/catch.

А>>У меня в Dispose — закрытие "ресурсов", во время которого тоже может произойти Exception.

_FR>Внутри Dispose() делать try/catch.


_FR>Что там за ресурсы такие и что там за освобождение, которое может закончиться исключением?



Есть класс для генерирования документов, в котором определён Dispose.

Есть один из подклассов — генерирование документов в MS Excel.

В Dispose — я закрываю Excel и освобождаю COM-объект, т.к. если этого не сделать, то Excel так и будет висеть в процессах
Для работы с Excel — используется позднее связывание + в качестве сервера используется удалённая машина.
Все работы с COM-объектами реализованы с использованием Dispose, т.к. если забыть и не освободить ссылку на COM объект, то Excel будет висеть в процессах.

Если в момент генерирования документа возникает ошибка, например убить Excel, то в Dispose — при закрытии Excel — возникнет ошибка.
Но ошибка может быть и другая и тогда Excel — нужно закрыть.
Re[5]: [.NET2] Exception + Dispose
От: _FRED_ Черногория
Дата: 03.11.10 09:39
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>Что там за ресурсы такие и что там за освобождение, которое может закончиться исключением?


А>Есть класс для генерирования документов, в котором определён Dispose.

А>Есть один из подклассов — генерирование документов в MS Excel.

А>В Dispose — я закрываю Excel и освобождаю COM-объект, т.к. если этого не сделать, то Excel так и будет висеть в процессах

А>Для работы с Excel — используется позднее связывание + в качестве сервера используется удалённая машина.
А>Все работы с COM-объектами реализованы с использованием Dispose, т.к. если забыть и не освободить ссылку на COM объект, то Excel будет висеть в процессах.

А>Если в момент генерирования документа возникает ошибка, например убить Excel, то в Dispose — при закрытии Excel — возникнет ошибка.

А>Но ошибка может быть и другая и тогда Excel — нужно закрыть.

И в Dispose() нет возможности определить, в валидном ли оно состоянии?

Тогда закрывайте Excel явно (то есть сделайте метод Close() и явно вызывайте его) — это действительно операция, которая может завершиться неудачно и внешний мир должен узнать об этом.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [.NET2] Exception + Dispose
От: nikov США http://www.linkedin.com/in/nikov
Дата: 04.11.10 19:14
Оценка: 5 (1)
Здравствуйте, Аноним, Вы писали:

А>Разве Exception может пропасть безвозвратно не будучи обработанным?


К сожалению, может. C# Language Specification, 8.10 The try statement:

If an exception is thrown during execution of a finally block, and is not caught within the same finally block, the exception is propagated to the next enclosing try statement. If another exception was in the process of being propagated, that exception is lost.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.