Теоретически конечный пользователь никогда не должен видеть внутренние ошибки. Но на практике теория и практика расходятся. Так что вопрос в том, что показывать конечному пользователю. Теперь, для совершенно нетехнических пользователей, вы хотите показывать как можно меньше ("нажмите здесь, чтобы отправить отчет об ошибке" типа вещей), но для более продвинутых пользователей они захотят знать, есть ли обходной путь, известно ли об этом какое-то время и т. д. Таким образом, вы также хотите включить некоторую информацию о том, что не так.
Классический способ сделать это — либо утверждение с именем файла:номер строки, либо трассировка стека с тем же самым. Теперь это хорошо для разработчика, потому что указывает ему прямо на проблему; однако у него есть некоторые существенные недостатки для пользователя, в частности, он очень загадочен (например, недружественный), а изменения кода изменяют сообщение об ошибке (поиск ошибки в Google работает только для этой версии).
У меня есть программа, которую я планирую написать, где я хочу решить эти проблемы. Что мне нужно, так это способ привязать к каждому утверждению уникальный идентификатор таким образом, чтобы редактирование кода вокруг утверждения не изменило его. (Например, если я вырезаю/вставляю его в другой файл, я хочу, чтобы отображалась та же информация) Есть идеи?
Один из способов, о котором я думаю, - это перечисление ошибок, но как убедиться, что они никогда не используются более чем в одном месте?
(Примечание: в этом вопросе я рассматриваю только ошибки, вызванные ошибками кодирования. Не то, что может произойти на законных основаниях, например, неверный ввод. OTOH, эти ошибки могут представлять определенный интерес для сообщества на большой.)
(Примечание 2: рассматриваемая программа будет приложением командной строки, работающим в системе пользователя. Но опять же, это только моя ситуация.)
(Примечание 3: целевой язык — D и Я очень хочу погрузиться в метапрограммирование. Приветствуются ответы на другие языки!)
(примечание 4: я явно хочу НЕ использовать фактические местоположения кода, а скорее какие-то символические имена для ошибок. Это потому, что, если код изменяется практически каким-либо образом, местоположения кода меняются.)