Харчування Винятки

Я час від часу аналізую файл, який містить дані MalFormed.

стека

і це кидає виняток,

я хотів би відновити виняток і проігнорувати погано відформатовані дані.

Який найкращий спосіб це зробити?

* EDIT: * Я думаю, моє запитання не було добре зрозуміле. я хотів би відновити виняток, будь-який виняток, я не хочу, щоб моя програма зупинялася. але продовжувати.

8 відповідей 8

Я думаю, що ви запитуєте ось що:

При синтаксичному аналізі файлу рядок за рядком, іноді поточний рядок має неправильні дані, що призводить до винятку у ваш код. Можливо, вам просто потрібно структурувати свій код таким чином, щоб try/catch оточував лише код синтаксичного аналізу, а не код зчитування рядків. Наприклад:

Зовнішній блок try/catch - правильно обробляти закриття об’єкта зчитування, якщо щось сталося під час спроби відкрити або прочитати файл. Внутрішній блок try/catch полягає в тому, щоб проковтнути винятки, які виникли, якщо дані зчитування були неправильно сформовані і не вдалося правильно проаналізувати.

Однак я погоджуюсь майже з усіма іншими. Просто проковтнути виняток може бути не добре. Принаймні, я рекомендую вам десь записати його.

Коротше кажучи, ви, мабуть, не повинні використовувати для цього винятки. Щось на зразок TryParse, який повертає false, є набагато ефективнішим і легшим для відновлення. Обробка винятків - це трохи підхід до тупих об’єктів.

Загалом, приблизно так:

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

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

Також переконайтеся, що ви не кидаєте занадто широку мережу і не їсте законних винятків, про які ви, можливо, захочете знати.

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

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

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