Возвращай не string, а объект, содержащий информацию о результате - Код ошибки, сообщение ошибки, флаг успеха, и сам Id. Можешь сделать даже Generic класс. У тебя Handler твой возвращает просто стринг - ты уже возвращаешь меньше информации о результате работы хэндлера, чем он на самом деле содержит. Это типичная проблема нарушения инвариантности. Так же и твой Exception - он не передаёт никакой информации о том, что пошло не так и тем самым создаёт множество возможных интерпритаций. Решить эту проблему можно многими способами:
1) Возвращай не string, а option/any типа AnyOf<Exception,string> и делай паттерн матчинг
2) Возвращай сложный объект реезультата
3) Создай кастомный Exception и кидай более специфичные ексепшены
4) Любыее другие способы пробросить информацию об ошибке обратно наверх