Обработка исключений в конструкторе класса - PullRequest
8 голосов
/ 24 мая 2011

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

public MyClass(/* some arguments */)
{
    try 
    {
      //do stuff...
    } catch(Exception e) {
      //do stuff, save logfile
      GC.SuppressFinalize(this);
    }

}

Причина, по которой я сделал это следующим образом, заключается в том, что если выдается исключение (обычно NullreferenceException), я хочу записать его в текстовый файл, и мне больше не нужен этот объект. но это хорошая практика? Если нет, как это сделать правильно?

1 Ответ

17 голосов
/ 24 мая 2011

Ваш код не вызывает сборщик мусора - он просто подавляет финализатор, что важно, только если у вашего класса есть финализатор, что довольно маловероятно.

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

try 
{
  //do stuff...
} catch(Exception e) {
  //do stuff, save logfile
  throw;
}

Сказав это, я, как правило, все равно пытался бы централизовать обработку исключений, поместив ее далеко в стек вызовов и разместив там все журналы. Было бы довольно редко помещать регистрацию в конструкторе IMO.

Если вы не опубликовали ссылку this в своем конструкторе, вновь созданный объект все равно будет иметь право на сборку мусора - вам больше ничего не нужно делать. Если вы реализуете IDisposable в своем классе, вы должны быть осторожны, чтобы высвободить любые ресурсы, которые вам уже требуются в конструкторе, но в большинстве случаев вы можете просто позволить всплыть исключению.

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