Вы создаете объект исключения без каких-либо сообщений (вы указываете только связанное исключение):
DBException dbExe = new DBException(sqlExe);
следовательно, вызов dbExe.getMessage()
может (правильно) вернуть null (детали зависят от того, что ваш конструктор делает в этой ситуации). Причина, по которой вы можете увидеть сообщение в трассировке стека, заключается в том, что генерация трассировки стека повторяется до основного исключения, и sqlExe.getMessage()
будет тем, что вы видите.
Решение - просто предоставить сообщение, а также основное исключение при создании вашего исключения. Общая мудрость заключается в том, что это должно отражать уровень, на котором генерируется исключение, поэтому, возможно, что-то вроде следующего:
DBException dbExe = new DBException("Unable to persist widgets", sqlExe);
Если ваше неуказанное «требование о существующем потоке кода» означает, что вам нужно, чтобы фактическое исключение базы данных было сообщением в dbExe, вы можете сконструировать это следующим образом:
DBException dbExe = new DBException(sqlExe.getMessage(), sqlExe);
хотя в целом это дублирование сообщения не очень приятно, и первый вариант является более «правильным».