Анализатор обнаружил ситуацию, когда исходный объект перехваченного исключения не был использован приемлемым образом при повторной генерации исключения из блока 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. |