Чому багато повідомлень про виключення не містять корисних даних?


220

Здається, існує певна угода, що повідомлення про виключення повинні містити корисні деталі .

Чому так, що багато поширених винятків із компонентів системи не містять корисних деталей?

Кілька прикладів:

  • .NET Listдоступ індексу ArgumentOutOfRangeExceptionніяк НЕ каже мені значення індексу , який був випробуваним і був недійсним, і не говорить мені допустимий діапазон.
  • В основному всі повідомлення про виключення зі стандартної бібліотеки MSVC C ++ є абсолютно марними (у тому ж ключі, що і вище).
  • Винятки Oracle у .NET, які говорять вам (перефразовано) "ТАБЛИЦЯ АБО ПЕРЕГЛЯД не знайдено", але не який .

Отже, мені здається, що здебільшого повідомлення про виключення не містять достатньої кількості деталей, щоб бути корисними. Чи не відповідають мої очікування? Я неправильно використовую винятки, що я навіть це помічаю? Або , може бути , моє враження оманливе: більшість винятків робити на самому ділі забезпечують корисні деталі?


59
Слід зазначити, що з боку фахівців з безпеки "повідомлення про помилки не повинні містити деталей про внутрішні системи", це правило.
Теластин

118
@Telastyn: Тільки якщо ваша система відкрита для зловмисників. Наприклад, якщо ви працюєте з веб-сервером, ви хочете надсилати кінцевому користувачеві незахищені повідомлення про помилки, але ви все ще хочете, щоб у вашому кінці входили дуже докладні повідомлення про помилки. А в програмному забезпеченні на стороні клієнта, коли користувач не є зловмисником, ви обов'язково хочете, щоб ці повідомлення про помилки були максимально детальними, щоб, коли щось пішло не так, і вам надійшло повідомлення про помилку, у вас є стільки інформації для роботи як можна, бо багато разів це все, що ти отримуєш.
Мейсон Уілер

9
@Snowman: Що для користувачів недоступне, якщо це програмне забезпечення на стороні клієнта? Власник машини володіє машиною і може отримати будь-що.
Мейсон Уілер


6
Завжди є якась додаткова інформація, яку ви хотіли б мати. Я вважаю, що повідомлення, які ви наводите як приклади, є досить хорошими. Ви можете налагодити проблему з ними. Набагато краще, ніж "помилка 0x80001234" (приклад натхненний оновленням Windows).
usr

Відповіді:


204

Винятки не містять корисних деталей, оскільки концепція винятків ще не визріла в рамках дисципліни інженерії програмного забезпечення, тому багато програмістів не розуміють їх повною мірою, а тому не ставляться до них належним чином.

Так, IndexOutOfRangeExceptionповинен містити точний індекс, який був поза діапазоном, а також діапазон, який був дійсним на той момент, коли його викинули, і це зневажливо від імені творців .NET часу виконання. Так, table or view not foundвиняток Oracle повинен містити назву таблиці чи виду, які не знайдено, і знову ж таки, факт, що це не зневажливо від імені того, хто за це відповідає.

Значною мірою плутанина випливає з оманливої ​​оригінальної ідеї про те, що винятки повинні містити повідомлення, прочитані людиною, що, в свою чергу, випливає з нерозуміння того, що стосується винятків, тому це порочний цикл.

Оскільки люди думають, що виняток повинен містити повідомлення, прочитане людиною, вони вважають, що будь-яка інформація, яка переноситься винятком, також повинна бути відформатована у зрозуміле для людини повідомлення, і тоді їм або нудно написати все повідомлення, прочитане людиною - будівельний код, або вони бояться, що це може поширювати недоцільну кількість інформації на те, на що б сторонні очі не побачили повідомлення. (Питання безпеки, згадані іншими відповідями.)

Але правда полягає в тому, що вони не повинні турбуватися про це, оскільки виняток не повинен містити зрозумілих для людини повідомлень. Виняток становлять речі, які повинні бачити та / або мати справу лише програмісти. Якщо будь-коли виникає потреба в наданні користувачеві інформації про відмову, це повинно бути зроблено на дуже високому рівні, витонченим чином та мовою користувача, що, статистично кажучи, навряд чи буде англійською.

Отже, для нас, програмістів, "повідомлення" винятку є назвою класу винятку , і будь-яка інша інформація, яка стосується винятку, повинна бути скопійована у (остаточний / лише для читання) змінний член об'єкта винятку. Переважно, кожен окремий елемент його можна уявити. Таким чином, жодне повідомлення не потрібно (або повинно) генерувати, а отже, жодні сторонні очі не можуть його бачити.

Щоб вирішити стурбованість, висловлену Томасом Оуенсом у коментарі нижче:

Так, звичайно, на якому - то рівні, ви будете створювати повідомлення журналу щодо виключення. Але ви вже бачите проблему з тим, що ви говорите: з одного боку, повідомлення журналу винятків без сліду стека марно, але з іншого боку, ви не хочете, щоб користувач бачив весь слід стека винятків. Знову ж таки, наша проблема полягає в тому, що наша перспектива перекошена традиційними методами. Файли журналів традиційно були в простому тексті, що, можливо, було добре, поки наша дисципліна була в зародковому стані, але, можливо, не більше: якщо існує проблема безпеки, то файл журналу повинен бути двійковим та / або зашифрованим.

Будь то двійковий чи звичайний текст, файл журналу слід розглядати як потік, у який додаток послідовно розміщує інформацію про налагодження. Такий потік був би лише для очей програмістів, а завдання генерування налагоджувальної інформації для винятку повинно бути таким же простим, як серіалізація винятку в потоці журналу налагодження. Таким чином, дивлячись на журнал, ви бачите ім'я класу виключень (яке, як я вже зазначив, є для всіх практичних цілей "повідомленням"), кожну зі змінних членів винятку, що описують все, що доречно - і-практичне включення-в-журнал та весь слід стека. Зверніть увагу, як у цьому процесі помітно відсутнє форматування повідомлення, яке читається людиною, виключення .

PS

Ще кілька моїх думок з цього приводу можна знайти у цій відповіді: Як написати гарне повідомлення про виключення

PPS

Здається, що багато людей відзначали мою пропозицію щодо бінарних файлів журналів, тому я ще раз змінив відповідь, щоб зробити ще більш зрозумілим, що те, що я пропоную тут, - це не те, що файл журналу повинен бути двійковим, а це Файл журналу може бути двійковим, якщо необхідно.


4
Я переглянув деякі класи винятків у .NET Framework, і виявляється, що існує багато можливостей для програмного додавання подібної інформації. Тож я гадаю, що питання вирішується на "чому б не зробити". Але +1 для всієї "читабельної" людини речі.
Роберт Харві

7
Я не погоджуюся, що винятки не повинні містити читабельних для людини компонентів. На якомусь рівні ви можете створити повідомлення журналу щодо винятку. Я б стверджував, що реєстрація сліду стека до файлу журналу, прочитаного користувачем, виявляє деталі реалізації, які ви не хочете виставляти, тому повідомлення, прочитане людиною, слід записувати в журнал. Коли вони представлені з файлом журналу, який містить помилку, розробники повинні мати початкову точку, щоб почати свою налагодження і мати можливість змусити виняток статися. Считаний людиною компонент повинен бути належним чином деталізований, не відмовляючись від реалізації.
Томас Оуенс

44
значить, програмісти не люди? Дивлячись на моїх колег, це підтверджує деякі підозри, які у мене виникли протягом певного часу ...
gbjbaanb

51
Знову ж таки, немає нічого поганого в тому, щоб дозволити користувачеві бачити весь слід стека , якщо це програмне забезпечення на стороні клієнта. Кожен професійний проект програмного забезпечення, над яким я коли-небудь працював, і більшість аматорських, також містив систему реєстрації даних, яка б генерувала повний дамп помилок, коли піднімався необроблений виняток, включаючи повні сліди стека всіх поточних поточних потоків у процес. І користувач міг (задихаючись, о жах!) Поглянути на це в будь-який час, коли це захоче, оскільки це необхідно (не просто корисно, але потрібно ) для того, щоб повернути нам повідомлення про помилку! Що з цим не так?
Мейсон Уілер

13
Я також не переконаний у відношенні файлів журналів лише для бінарних файлів. В основному через мій досвід роботи з systemd. Його спеціальний інструмент для перегляду цих журналів досить заплутаний і, здається, був розроблений комітетом мавп Шекспіра. Подумайте, що для веб-додатків першим, хто побачить ваш виняток, часто стає сидсмін , і він хоче визначити, чи потрібно щось йому виправити (наприклад, у диска не вистачало місця) або повернути назад розробникам.
Майкл Хемптон

46

Чому так, що багато поширених винятків із компонентів системи не містять корисних деталей?

На мій досвід, існує ряд причин того, що винятки не містять корисної інформації. Я сподіваюся, що подібні причини стосуватимуться і системних компонентів, але я не знаю точно.

  • Люди, орієнтовані на безпеку, бачать винятки як джерело витоку інформації ( наприклад ). Оскільки поведінка винятків за замовчуванням полягає в тому, щоб відображати цю інформацію користувачеві, програмісти іноді помиляються на стороні обережності.
  • У C ++ я чув аргументи проти розподілу пам’яті в блоки захоплення (де лежить хоча б частина контексту для створення хороших повідомлень). Цим розподілом важко керувати, і що ще гірше, це може спричинити виняток із пам'яті, який часто зберігається - часто виходить з ладу додаток або протікає пам'ять. Важко добре форматувати винятки без розподілу пам’яті, і ця практика може мігрувати між мовами, як це роблять програмісти.
  • Вони не знають. Я маю на увазі, є сценарії, коли код не має поняття, що пішло не так. Якщо код не знає - він не може вам сказати.
  • Я працював у місцях, де проблеми локалізації заважали вводити в систему лише рядки англійською мовою - навіть за винятками, які читатимуть лише співробітники служби підтримки англійською мовою.
  • У деяких місцях я бачив, як винятки використовуються більше, як твердження. Вони там, щоб надати чітке, гучне повідомлення під час розробки, що щось не робиться, або в деяких місцях відбулася зміна, але не в іншому. Вони часто є досить унікальними, щоб гарне повідомлення було б дублювати зусилля або просто заплутати.
  • Люди ліниві, програмісти більше, ніж більшість. Ми витрачаємо набагато менше часу на винятковий шлях, ніж щасливий шлях, і це побічний ефект.

Чи не відповідають мої очікування? Я неправильно використовую Винятки, що я це навіть помічаю?

Щось? Я маю на увазі, що у винятках мають бути приємні повідомлення, але вони також є винятками . Вам слід витратити свій час на розробку коду, щоб уникнути виняткових умов, або написати код для обробки виняткових умов (ігнорування повідомлення), не використовуючи їх як свого роду інтерактивний механізм зворотного зв’язку при кодуванні. Використовувати їх для налагодження неминуче, але в більшості ситуацій слід звести до мінімуму. Те, що ви помітили цю проблему, викликає занепокоєння, що ви не робите достатньо хорошої роботи, щоб запобігти їх.


Я знаю, що це позначено як C, але я повинен додати, що ваш останній абзац не застосовується до всіх мов, оскільки деякі можуть (правильно чи неправильно) сильно покладатися на обробку помилок та звітування про помилки на основі винятку .
Ліліенталь

1
@Lilienthal - такі як? Жодна мова, з якою я дуже добре знайомий, не робить подібні речі регулярно.
Теластин

1
Я думаю, що ця відповідь має багато корисного змісту, але вона уникає говорити підсумок, який є "Вони повинні".
djechlin

3
Дякую. Ваше занепокоєння безпідставне (сподіваюся :-). Але кожен раз, коли я витрачаю додаткову хвилину на відстеження того, що пішло не так у тій тестовій одиниці, або витрачаю додатковий час на аналіз коду, тому що в файлі файлів не вистачає інформації, мене дратує дразнення деяких повідомлень, які можна уникнути :-)
Martin Ba

Власний ABAP @Telastyn SAP має структуру класу винятків, може містити повідомлення, яке в основному є об'єктом, призначеним спеціально для повідомлення стану програми (успіх, збій, попередження) користувачеві разом з динамічним (багатомовним) повідомленням. Зізнаюся, я не знаю, наскільки поширений такий предмет, або якщо це навіть заохочується в мовах, якщо це можливо, але є принаймні одна, де це (на жаль) звичайна практика.
Ліліенталь

12

У мене немає надлишків досвіду C # або конкретно C ++, але я можу вам сказати це - винятки, написані розробниками 9 з 10 разів, корисніші за будь-який загальний виняток, який ви коли-небудь знайдете, за період.

В ідеалі, так, загальний виняток вкаже на те, чому саме сталася помилка, і ви зможете її виправити з легкістю - але реально, у великих програмах із декількома класами, які можуть створювати велику кількість різноманітних винятків, або ж роду винятками, завжди цінніший , щоб написати свій власний вихід для повернення помилки , ніж покладатися на повідомлення за замовчуванням.

Ось так і має бути, оскільки як багато людей вказали, деякі програми не хочуть надсилати повідомлення про помилку, яке вони не хочуть, щоб користувач бачив їх з міркувань безпеки або щоб не заплутати їх.

Натомість ви повинні передбачити у своєму дизайні, які типи помилок можуть бути подані у вашій програмі (і завжди будуть помилки) та писати повідомлення про помилки, які допоможуть вам визначити проблему.

Це не завжди допоможе вам, тому що ви не завжди можете передбачити, яке повідомлення про помилку буде корисним - але це перший крок до кращого розуміння вашої власної програми.


7

Питання конкретно запитує, чому так багато винятків, викинутих "компонентами системи" (також стандартними бібліотечними класами), не містять корисних відомостей.

На жаль, більшість розробників не записують основні компоненти в стандартні бібліотеки, а також детальні проектні документи чи інші обгрунтування дизайну не обов'язково оприлюднюються. Іншими словами, ми можемо ніколи не знати точно.

Однак слід пам’ятати про те, чому детальна інформація про виключення може бути не бажаною чи важливою:

  1. Винятком може бути використаний виклик коду будь-яким способом: стандартна бібліотека не може розміщувати обмеження щодо використання винятку. Зокрема, він може відображатися користувачеві. Розгляньте індекс масиву поза межами: це може дати корисній інформації зловмиснику. Мовний дизайнер не має уявлення про те, як програма буде використовувати викинуте виняток або навіть який тип програми це (наприклад, веб-додаток або настільний ПК), тому вивільнення інформації може бути безпечнішим з точки зору безпеки.

  2. Винятки не повинні відображатися користувачеві. Натомість покажіть дружнє повідомлення про помилку та введіть виняток у місце, де зловмисник не має доступу (якщо це застосовано). Після виявлення помилки розробник повинен налагоджувати код, перевіряючи кадри стеків та логічні шляхи. На даний момент у розробника є більше інформації, ніж будь-який виняток, який можна було б сподіватися.


3
1. Виходячи з цих критеріїв, видається порівняно довільним, що таке інформація ("Індекс поза діапазоном", слід стека), а ні (значення індексу). 2. Налагодження може бути набагато швидшим та простішим, коли відомі відповідні динамічні значення. Наприклад, часто одразу вам скажуть, чи проблема полягає в внесенні сміття до невдалого фрагмента коду, чи той код не вдається правильно впоратись із хорошим вкладом
Бен Ааронсон,

@BenAaronson ідентичність / клас винятку повідомляє нам про тип помилки. Моя думка, реквізити можуть бути пропущені (тобто яке конкретне значення спричинило помилку) для безпеки. Це значення може бути відстежено до вводу користувача, розкриваючи інформацію зловмиснику.

@Snowman Навряд чи я вважаю, що безпека - це врахування, коли доступний повний слід стека, а номер індексу - ні. Звичайно, я розумію, що зловмисник перевіряє переповнення буфера, але багато винятків також залишають цілком безпечні дані (наприклад, яку таблицю Oracle не знайдено)
gbjbaanb

@gbjbaanb, хто каже, що нам потрібно показати повний слід стека користувачеві?

1
Дякуємо, що поділилися цією інформацією. Особисто я не згоден і вважаю, що аргумент безпеки є повною помилкою, але це може бути обґрунтуванням.
Мартін Ба

4

По-перше, дозвольте мені розірвати бульбашку, сказавши, навіть якщо діагностичне повідомлення завантажене інформацією, яка приведе вас до точного кодового рядка та підкоманди за 4 секунди, швидше за все, користувачі ніколи не записують його чи не передадуть його людям підтримки і вам скажуть "Ну, це щось говорило про порушення ... Я не знаю, це виглядало складно!"

Я пишу програмне забезпечення та підтримую результати інших програм вже більше 30 років, і особисто я нинішнє якість повідомлення про винятки практично не має нічого спільного з безпекою, незалежно від того, як кінцеві результати траплялися відповідно до їх моделі Всесвіт, набагато більше спільного з тим, що стільки в нашій галузі спочатку були самоучками, і вони просто ніколи не включали уроки спілкування. Можливо, якби ми примусили всі нові кодери перейти на технічне обслуговування на пару років, коли їм довелося розібратися з тим, що пішло не так, вони зрозуміли б важливість хоч якоїсь форми точності.

Нещодавно у програмі, що перебудовується, було прийнято рішення про те, що коди повернення потраплять до однієї з трьох груп:

  • 0 - 9 буде успішним завдяки успіху з додатковою інформацією.
  • 10 - 99 були б не фатальними (відновлюваними) помилками та
  • 101 - 255 були б фатальними помилками.

(100 чомусь залишили осторонь)

У будь-якому конкретному робочому процесі наша думка була повторно використана, або загальний код використовував би загальну віддачу (> 199) для фатальних помилок, залишаючи нам 100 можливих помилок для робочого потоку. При незначній диференціації даних у повідомленні такі помилки, як файл, який не знайдено, можуть використовувати один і той же код і розрізняти повідомлення.

Коли код повернувся від підрядників, ви не повірите нашому здивуванню, коли практично ВСЕ ЄДИННА ФАТАЛЬНА ПОМИЛКА повертала код 101.

Я вважаю, що відповідь на ваше запитання є настільки безглуздим, оскільки коли вони були створені, вони повинні були бути заповнювачами, до яких ніхто не повернувся. Зрештою, люди придумали, як виправити проблеми не через повідомлення, а розкидають їх.

З того часу люди самоучки просто ніколи не мали хорошого прикладу того, що має містити виняток. Додайте до цього, що більше користувачів не читають повідомлення, тим більше намагаються передати їх підтримці (я бачив повідомлення про помилки, які були вирізані та вставлені використовуваними, які потім були відредаговані перед надсиланням з наступним коментарем, що це здавалося, що багато інформації, і я, можливо, не міг цього все бажати, тому вони випадковим чином видалили купу.

І давайте зіткнутися з цим, так як занадто багато (не все, але дуже багато) кодерів наступного покоління, якщо це більше роботи і не додає спалаху, просто не варто ...

Останнє зауваження: Якщо повідомлення про помилку включає код помилки / повернення, мені здається, що десь у виконаних модулях повинен бути рядок, який читає щось на кшталт "якщо умова повертає код-значення" та умова повинна розповісти вам, чому код повернення сталося. Це здається простим логічним підходом, але для мене життя, просто Спробуйте, щоб Microsoft повідомив вам, що сталося, коли оновлення Windows не вдалося на CODE 80241013 або якийсь інший дуже унікальний ідентифікатор. Як ні сумно, чи не так?


8
"... ви б не повірили нашому здивуванню, коли практично ВСЕ ЄДИННА ФАТАЛЬНА ПОМИЛКА була поверненням коду 101." Ти правий. Я б не повірив, що ви були здивовані, коли підрядник дотримувався ваших вказівок.
Одалрік

3
chances are the users will never write it down... and you will be told "Well it said something about a violation..." Ось чому ви використовуєте інструмент реєстрації винятків, щоб автоматично генерувати звіт про помилки, що містить слід стека і, можливо, навіть надсилав його на ваш сервер. Один раз у мене був один користувач, який не був дуже технічним. Кожного разу, коли вона надсилала повідомлення з реєстратора помилок, воно проходило б на кшталт "Я не впевнений, що я зробив не так, але ..." незалежно від того, скільки разів я пояснював, що ця помилка означала, що помилка була на моїй стороні . Але я завжди отримував від неї повідомлення про помилки!
Мейсон Уілер

3

Хоча я згоден, що винятки повинні містити якомога більше інформації або принаймні бути менш загальною. У випадку не знайденого регістру таблиці ім'я таблиці було б добре.

Але ви знаєте більше про те, що ви намагалися зробити на місці в коді, де отримали виняток. Хоча ви часто дійсно не можете багато виправити ситуацію, коли в бібліотеці поза вашим контролем щось не так, ви можете додати набагато більше корисної інформації про те, в якій ситуації щось пішло не так.

У випадку, коли таблиця не знайдена, вона не допоможе вам сильно, якщо вам скажуть, що таблицю, яку неможливо знайти, називають СТУДЕНТИ, оскільки у вас немає такої таблиці, і ця рядок ніде у вашому коді.

Але якщо ви виберете виняток і повторно закинете його за допомогою SQL-оператора, який ви намагалися виконати, вам буде краще, так як виявиться, що ви намагалися вставити запис із полем імені " Роберт"); ДРОПУВАТИ СТУДЕНТИ СТОЛІ; (Завжди є xkcd!)

Отже, для боротьби з менш інформативними винятками: спробуйте вловити повторне винесення з додатковою інформацією, що стосується того, що ви намагалися зробити.

Я, мабуть, повинен додати, щоб це було більше відповіддю на те, чому в питанні, що ймовірною причиною, чому фокус з боку виробників бібліотек був не на покращенні повідомлень про виключення, є те, що вони не знають чому щось було випробувано, що не вдалося, ця логіка є в коді виклику.


наприклад, в C ++ ви повинні throw_with_nestedбагато використовувати .
Майлз Рут

3

Щоб дати трохи іншу відповідь: Код порушника, мабуть, був зроблений для специфікації:

  • Функція отримує X і повертає Y
  • Якщо X недійсний, киньте виняток Z

Додайте тиск, щоб точно поставити спекуляції (побоюючись відхилення при перегляді / тестуванні) за мінімальний час і з мінімальною суєтою, тоді у вас є ваш рецепт цілком сумісного і непридатного бібліотечного винятку.


3

Виключення мають вартість, пов’язану з мовою та впровадженням.

Наприклад, потрібні винятки C ++, щоб знищити всі живі дані між передачею кадру виклику та захопленням кадру виклику, і це дорого. Отже, програмісти не бажають багато використовувати винятки.

У Ocaml викид винятків відбувається настільки ж швидко, як і на C setjmp(його вартість не залежить від кількості кадрів пройденого виклику), тому розробники можуть використовувати його велику кількість (навіть для не виняткових, дуже поширених випадків). На відміну від цього, винятки на C ++ досить важкі, тому, ймовірно, ви не будете користуватися ними так, як у Ocaml.

Типовим прикладом є деякий рекурсивний пошук чи розвідка, який можна «зупинити» всередині досить глибокої рекурсії (наприклад, знайти листок у дереві чи функцію об’єднання). У деяких мовах швидше (так ідіоматичніше) поширити цю умову кожному абоненту. В інших мовах кидання винятку швидше.

Тож залежно від мови (та звичок розробників, які нею користуються), виняток може містити багато корисних деталей, або навпаки, використовуватись як швидкий немісцевий стрибок та нести лише дуже корисні дані.


6
"Наприклад, потрібні винятки на C ++, щоб знищити всі живі дані між передачею кадру виклику та захопленням кадру виклику, і це дорого. Отже, програмісти не бажають багато використовувати винятки." Загальне лайно. Основна сила винятків C ++ полягає в тому, що деструктори викликаються детерміновано. Ніхто б не користувався ними, якби вони просто стрибали.
Майлз Рут

Я це знаю, але факт, що винятки C ++ не схожі на Ocaml, і ви не використовуєте їх, як у Ocaml.
Базиль Старинкевич

5
Ви не використовуєте винятки C ++ для керування потоком в C ++ насамперед, оскільки це робить код нечитабельним і важким для розуміння.
Майлз Рут

-2

Чому ви вважаєте, що значення індексу або необхідний діапазон чи назва таблиці є корисною деталлю, за винятком?

Винятки не є механізмом обробки помилок; вони є механізмом відновлення .

Суть винятків полягає в тому, щоб піднятися до рівня коду, який може обробляти виняток. Де б ви не знаходилися, вам потрібна інформація, або вона не є актуальною. Якщо є потрібна вам інформація, але ви не маєте негайного доступу до неї, ви не обробляєте виняток на відповідному рівні.

Один раз, коли я можу придумати, де додаткова інформація могла б бути корисною, це на абсолютному верхньому рівні вашої програми, де ви зриваєтесь та видаєте дамп помилок; але винятком не є завдання доступу, збирання та зберігання цієї інформації.

Я не кажу, що ви можете просто поставити "кинути новий виняток" скрізь і називати це хорошим, можна писати погані винятки. Але правильне використання їх, включаючи нерелевантну інформацію, не є обов'язковим.


Я б не назвав назву відсутньої таблиці бази даних як нерелевантну, хоча я розумію і співчуваю вашому моменту. Я дав тобі голос.
Даніель Холлінрак

1
@DanielHollinrake Так, назва таблиці, безумовно, найменш нерелевантна з прикладів. У коді, з яким я працюю, подібні проблеми є гнітюче поширеними, і дивлячись на те, як керована назва таблиці, дає підказки на те, що не так. Я намагався придумати приклад, чому ці речі не мають значення для винятку; можливо, я можу це використати ...
Одалрік,

Я не погоджуюсь. Для обробки винятку додаткові деталі можуть не знадобитися, оскільки ви просто хочете захистити програму від збоїв, але, нарешті, вам потрібно буде сказати, чому вона не працює, і мати можливість її виправити. Якщо у вас немає жодних підказок, але тип винятку, тоді добре виглядайте налагодження.
t3chb0t

@ t3chb0t Саме для цього слід відстежувати стек і клас стендів винятків та пам'яті та всього іншого. Як це допоможе вам, якщо клієнт зателефонує і каже "Комп'ютер мені каже, що він намагався отримати доступ до індексу 5, а його там не було". Це може допомогти лише в тому випадку, якщо ви також серіалізуєте список, а також контекст для цього списку та все інше, що може бути корисним. Ви не повинні серіалізувати весь стан програми щоразу, коли ви кидаєте виняток.
Одалрік

@Odalrick для клієнта це може не мати ніякого значення , але як розробник я ціную кожну інформацію , яку я можу отримати ;-) , то , може бути , ще один приклад: скажімо, SqlExeption відбувається , і це все , що ви знаєте ... Це набагато простіше відновити його якщо ви знаєте, яка рядок підключення або база даних чи таблиця тощо не працювали .... і це ще важливіше, якщо ваша програма використовує кілька баз даних. Детальний слід стека вимагає, щоб файли pdb надсилалися разом із додатком ... це не завжди можливо. Також скиди пам'яті можуть стати дуже великими і не завжди можуть бути передані.
t3chb0t
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.