Как да уловя и регистрирам изключение вътре в Using оператор, без да използвам try-catch?

Както знам, че операторът Using има вградена реализация на Dispose() и Try-Catch. Така че искам да знам няколко неща

  1. Възможно ли е да се регистрира изключение в оператора using без да се използва блок try-catch, вътре или извън оператора. Ако не, тогава защо е вградено в изявлението.

  2. Вложена или прекомерна употреба на try-catch не е за предпочитане, защо тогава предпочита да се използва такъв модел.

            using (some_resource)
            {
                try
                {
                }
                catch
                {
                }
                finally
                {
                    //my exception logging mechanism
                }
            }
    

ще стане

            try
            {
                try
                {
                }
                catch
                {
                }
                finally
                {
                    //my exception logging mechanism
                }
            }
            catch
            {
            }
            finally
            {
                //some_resource.Dispose()
            }

person Community    schedule 11.07.2013    source източник
comment
using не се превежда на try-catch, а само на try-finally.   -  person Blorgbeard    schedule 11.07.2013
comment
Не трябва ли механизмът за регистриране на изключения да е вътре в „catch“, а не „finally“?   -  person Botis    schedule 11.07.2013
comment
от къде черпиш предпочитанията си?   -  person Jodrell    schedule 11.07.2013


Отговори (2)


Изявление using включва try/finally; няма catch. Но честно казано, вашата загриженост е пресилена; многовложен и сложен try/catch/finally е "нежелан", защото:

  • това прави кода труден за четене
  • и още по-трудно да се оправи (повечето хора го разбират погрешно, уви)
  • често се злоупотребява
  • това предполага, че вашият метод прави твърде много

С using това не е проблем; това прави намерението много чисто, без добавяне на сложност или загриженост.

Просто бих използвал:

using (some_resource) {
    try {
        // some code
    } catch (Exception ex) {
        LogIt(ex);
        throw;
    }
}
person Marc Gravell    schedule 11.07.2013

Използване на компилации за изпробване{}Накрая{}. Вижте следния въпрос: Инструкция C# using изпълнява ли try/finally?

Причината за това е, че ресурсът ще бъде изхвърлен, независимо дали е хвърлено изключение. Изхвърлянето на ресурси е целта на оператора за използване.

Правилното изпълнение е:

using(Resource myresource = GetResource())
{
    try
    {}
    catch(Exception e)
    { //Maybe log the exception here when it happens?
    }
}
person David Colwell    schedule 11.07.2013