Анализатор обнаружил ситуацию, когда исходный объект перехваченного исключения не был использован приемлемым образом при повторной генерации исключения из блока catch. Из-за этого ряд ошибок превращается в трудноотлаживаемые, так как теряется стек оригинального исключения.
Рассмотрим несколько примеров некорректного кода. Первый пример:
public Asn1Object ToAsn1Object()
{
try
{
return Foo(_constructed, _tagNumber);
}
catch (IOException e)
{
throw new ParsingException(e.Message);
}
}
В данном случае перехваченное исключение ввода/вывода хотели трансформировать в другое исключение типа 'ParsingException'. При этом передали только сообщение из первого исключения, тем самым сократив количество полезной информации.
Корректный вариант кода:
public Asn1Object ToAsn1Object()
{
try
{
return Foo(_constructed, _tagNumber);
}
catch (IOException e)
{
throw new ParsingException(e.Message, e);
}
}
В исправленном варианте исходное исключение передается в качестве внутреннего, что полностью сохраняет информацию об исходной ошибке.
Рассмотрим второй пример:
private int ReadClearText(byte[] buffer, int offset, int count)
{
int pos = offset;
try
{
....
}
catch (IOException ioe)
{
if (pos == offset) throw ioe;
}
return pos - offset;
}
В данном случае перехваченное исключение ввода/вывода генерируется повторно и полностью "затирает" стек оригинальной ошибки. Чтобы этого избежать, достаточно сделать переброс оригинального исключения.
Корректный вариант кода:
private int ReadClearText(byte[] buffer, int offset, int count)
{
int pos = offset;
try
{
....
}
catch (IOException ioe)
{
if (pos == offset) throw;
}
return pos - offset;
}
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3052. |