# V5306. OWASP. The original exception object was swallowed. Cause of original exception could be lost.

Анализатор обнаружил ситуацию, когда оригинальная информация об исключении была утеряна при повторной генерации из блока 'catch'. Из-за этого ошибки превращаются в трудноотлаживаемые.

Отсутствие чёткой идентификации возникшей проблемы несёт дополнительные риски с точки зрения безопасности. Недостаточное логирование и мониторинг (в том числе обнаружение проблем) выделены в отдельную категорию рисков в OWASP Top 10 Application Security Risks 2017: A10:2017-Insufficient Logging & Monitoring.

Рассмотрим пример некорректного кода:

    try {
      sb.append((char) Integer.parseInt(someString));
      ....
    } catch (NumberFormatException e) {
      throw new IllegalArgumentException();
    }

В данном случае перехваченное исключение хотели перебросить и не передали полезную информацию в виде сообщения и stacktrace.

Корректный вариант кода:

    try {
      sb.append((char) Integer.parseInt(someString));
      ....
    } catch (NumberFormatException e) {
      throw new IllegalArgumentException(e);
    }

В исправленном варианте исходное исключение передаётся в качестве внутреннего, что полностью сохраняет информацию об исходной ошибке.

Другим вариантом исправления может являться выбрасывание исключения с сообщением пользователю:

    try {
      sb.append((char) Integer.parseInt(someString));
      ....
    } catch (NumberFormatException e) {
      throw new IllegalArgumentException(
        "String " + someString + " is not number"
      );
    }

В данной ситуации стек оригинальной ошибки был утерян, но описанная информация в новом исключении внесёт большую ясность при отладке этого кода.

Если потеря информации об исключении является ожидаемым поведением, то вы можете заменить имена 'catch'-параметров на "ignore" или "expected", и исключение выдаваться не будет.

Данная диагностика классифицируется как:

CWE-390 OWASP-11.1.8