Винятки не містять корисних деталей, оскільки концепція винятків ще не визріла в рамках дисципліни інженерії програмного забезпечення, тому багато програмістів не розуміють їх повною мірою, а тому не ставляться до них належним чином.
Так, IndexOutOfRangeException
повинен містити точний індекс, який був поза діапазоном, а також діапазон, який був дійсним на той момент, коли його викинули, і це зневажливо від імені творців .NET часу виконання. Так, table or view not found
виняток Oracle повинен містити назву таблиці чи виду, які не знайдено, і знову ж таки, факт, що це не зневажливо від імені того, хто за це відповідає.
Значною мірою плутанина випливає з оманливої оригінальної ідеї про те, що винятки повинні містити повідомлення, прочитані людиною, що, в свою чергу, випливає з нерозуміння того, що стосується винятків, тому це порочний цикл.
Оскільки люди думають, що виняток повинен містити повідомлення, прочитане людиною, вони вважають, що будь-яка інформація, яка переноситься винятком, також повинна бути відформатована у зрозуміле для людини повідомлення, і тоді їм або нудно написати все повідомлення, прочитане людиною - будівельний код, або вони бояться, що це може поширювати недоцільну кількість інформації на те, на що б сторонні очі не побачили повідомлення. (Питання безпеки, згадані іншими відповідями.)
Але правда полягає в тому, що вони не повинні турбуватися про це, оскільки виняток не повинен містити зрозумілих для людини повідомлень. Виняток становлять речі, які повинні бачити та / або мати справу лише програмісти. Якщо будь-коли виникає потреба в наданні користувачеві інформації про відмову, це повинно бути зроблено на дуже високому рівні, витонченим чином та мовою користувача, що, статистично кажучи, навряд чи буде англійською.
Отже, для нас, програмістів, "повідомлення" винятку є назвою класу винятку , і будь-яка інша інформація, яка стосується винятку, повинна бути скопійована у (остаточний / лише для читання) змінний член об'єкта винятку. Переважно, кожен окремий елемент його можна уявити. Таким чином, жодне повідомлення не потрібно (або повинно) генерувати, а отже, жодні сторонні очі не можуть його бачити.
Щоб вирішити стурбованість, висловлену Томасом Оуенсом у коментарі нижче:
Так, звичайно, на якому - то рівні, ви будете створювати повідомлення журналу щодо виключення. Але ви вже бачите проблему з тим, що ви говорите: з одного боку, повідомлення журналу винятків без сліду стека марно, але з іншого боку, ви не хочете, щоб користувач бачив весь слід стека винятків. Знову ж таки, наша проблема полягає в тому, що наша перспектива перекошена традиційними методами. Файли журналів традиційно були в простому тексті, що, можливо, було добре, поки наша дисципліна була в зародковому стані, але, можливо, не більше: якщо існує проблема безпеки, то файл журналу повинен бути двійковим та / або зашифрованим.
Будь то двійковий чи звичайний текст, файл журналу слід розглядати як потік, у який додаток послідовно розміщує інформацію про налагодження. Такий потік був би лише для очей програмістів, а завдання генерування налагоджувальної інформації для винятку повинно бути таким же простим, як серіалізація винятку в потоці журналу налагодження. Таким чином, дивлячись на журнал, ви бачите ім'я класу виключень (яке, як я вже зазначив, є для всіх практичних цілей "повідомленням"), кожну зі змінних членів винятку, що описують все, що доречно - і-практичне включення-в-журнал та весь слід стека. Зверніть увагу, як у цьому процесі помітно відсутнє форматування повідомлення, яке читається людиною, виключення .
PS
Ще кілька моїх думок з цього приводу можна знайти у цій відповіді: Як написати гарне повідомлення про виключення
PPS
Здається, що багато людей відзначали мою пропозицію щодо бінарних файлів журналів, тому я ще раз змінив відповідь, щоб зробити ще більш зрозумілим, що те, що я пропоную тут, - це не те, що файл журналу повинен бути двійковим, а це Файл журналу може бути двійковим, якщо необхідно.