Предупреждение вероятно о MyResponse
, что IDisposable
.
Почему появляется предупреждение?
Если объект MyResponse
создан, но код, приведенный позже в методе, вызывает исключение, то все ссылки на этот объект будут потеряны (у нас был только один, и нам не удалось его вернуть). Это означает, что Dispose
больше нельзя вызывать для объекта, и мы будем полагаться на финализатор класса для очистки любых ресурсов.
Имеет ли это значение?
Вообще говоря, это будет иметь значение, только если:
-
IDisposable
инкапсулирует ресурс, который может понадобиться "в ближайшее время" другим частям программы или другому процессу
- Исключение выдается до возврата метода, чтобы вызвать «проблему»
- Этот ресурс не высвобождается финализатором достаточно быстро, или , по какой-то причине финализатор никогда не запускается, но ваше приложение не закрывается
Так что нет, это не должно иметь большого значения.
Как это исправить?
public MyResponse MyMethod(string arg)
{
MyResponse abc = null;
try {
abc = new MyResponse();
using (Tracer myTracer = new Tracer(Constants.TraceLog))
{
// Some code
return abc;
}
}
catch {
if (abc != null) {
abc.Dispose();
}
throw;
}
}
Это гарантирует, что если управление выйдет из метода с помощью исключения, abc
будет либо null
, либо правильно удалено.
Обновление
Оказывается, при использовании этого способа обработки вещей, исключение, явно выброшенное изнутри MyMethod
, будет переброшено и будет мутирован номер строки первого кадра стека, чтобы указывать на throw;
заявление.
Практически это означает, что если у вас есть несколько throw
операторов внутри MyResponse
, и они выдают одинаковый тип исключения с одним и тем же сообщением, вы не сможете сказать, какой именно throw
был ответственным именно тогда, когда вы ловите исключение.
Это ИМХО чисто академическая проблема, но я упомяну ее для полноты.