А поскольку пользователь может обойти и браузер и GUI
Пользователь не должен уметь обходить, он должен иметь gui и/или api)
Да, тема не самая легкая, но мне кажется, что вы забегаете наперед со слоями доменов и остальными понятиями ddd и паттернами.
Exception должен указывать проблему на том уровне, на котором он возникает - исключение валидации на этапе валидации, исключение прав отправки денег на этапе проверки прав пользователя и т.д. Это решается нормальным распределением обязанностей классов и методов.
Некоторые ошибки могут быть штатными в ряде случаев (как те же права пользователя) и не надо их эскалировать до исключения. Если пользователь может повлиять на исправление проблемы, то надо ему вернуть полный текст ошибки (нп. он должен пополнить счет, чтобы переслать сумму, поменять настройки или ввести правильные данные), если это чисто server-side ошибка, то естественно не надо показывать детали проблемы пользователю.