У нас є додаток WPF, де його частини можуть викидати винятки під час виконання. Я б хотів глобально зловити будь-які необроблені винятки і записати їх, але в іншому випадку продовжуйте виконання програми так, ніби нічого не сталося (начебто як VB On Error Resume Next
).
Чи можливо це в C #? І якщо так, то де саме мені потрібно поставити код обробки винятків?
В даний час я не бачу жодної точки, де я міг би обернутися try
/ catch
навколо, і який би охопив усі винятки, які можуть статися. І навіть тоді я залишив би все, що було страчено через улов. Або я думаю тут у жахливо неправильних напрямках?
ETA: Оскільки багато людей нижче вказали на це: додаток не для управління атомними електростанціями. Якщо вона виходить з ладу, це не так вже й велика справа, але випадкові винятки, що стосуються переважно інтерфейсу користувача, викликають неприємності в контексті, де вона буде використовуватися. Було (і, мабуть, все ще) декілька з них, і оскільки вона використовує архітектуру плагінів і може бути розширена іншими (також студенти в цьому випадку, тому немає досвідчених розробників, які можуть написати повністю код без помилок).
Що стосується винятків, які потрапляють: я реєструю їх у файлі журналу, включаючи повний слід стека. В цьому і полягала вся суть цієї вправи. Просто для протидії тим людям, які надто буквально сприймали мою аналогію до VERN's OERN.
Я знаю, що сліпе ігнорування певних класів помилок небезпечно і може пошкодити екземпляр моєї програми. Як говорилося раніше, ця програма не є критичною для будь-якої місії. Ніхто з їх розумного розуму не став би на це виживання людської цивілізації. Це просто невеликий інструмент для тестування певних підходів до проектування. розробка програмного забезпечення.
Для негайного використання програми не так багато речей, які можуть статися за винятком:
- Не виняток - обробка помилок та вихід із програми. Експеримент потрібно повторити, хоча ймовірно з іншою темою. Жодних помилок не було зафіксовано, що шкода.
- Загальне поводження з винятками - доброякісна помилка в пастці, шкоди не завдано. Це має бути загальний випадок, який судять з усіх помилок, які ми спостерігали під час розробки. Ігнорування подібних помилок не повинно мати негайних наслідків; основні структури даних перевірені досить добре, щоб вони легко пережили це.
- Загальне поводження з винятками - серйозна помилка в пастці, можливо, аварія в більш пізній момент. Це може траплятися рідко. Ми ніколи цього не бачили. Помилка реєструється в будь-якому випадку, і збій може бути неминучим. Тож це концептуально схоже на перший випадок. За винятком того, що у нас є слід стека. І в більшості випадків користувач навіть не помітить.
Що стосується даних експерименту, згенерованих програмою: Серйозна помилка, в гіршому випадку, просто не призведе до запису даних. Тонкі зміни, які так незначно змінюють результат експерименту, є малоймовірними. І навіть у тому випадку, якщо результати здаються сумнівними, помилка була зафіксована; все-таки можна викинути цю точку даних, якщо це тотальний вигляд.
Підводячи підсумок: Так, я вважаю себе як мінімум частково здоровим, і не вважаю глобальну процедуру поводження з винятками, яка залишає програму обов'язково абсолютно злою. Як було сказано двічі раніше, таке рішення може бути дійсним, залежно від заявки. У цьому випадку його судили правильним рішенням, а не тотальним і повним глупотою. Для будь-якої іншої програми це рішення може виглядати інакше. Але, будь ласка, не звинувачуйте мене чи інших людей, які працювали над цим проектом, щоб потенційно підірвати світ лише тому, що ми ігноруємо помилки.
Побічна примітка: Для цього додатка існує точно один користувач. Це не щось на зразок Windows або Office, яким мільйони звикають, коли вартість наявності міхура винятків для користувача взагалі була б дуже різною в першу чергу.
On Error Resume Next
в C # неможливий. Після того, як у Exception
(C # немає "помилок"), ви не можете просто відновити наступне твердження: виконання буде продовжено в catch
блоці - або в одному з обробників подій, описаних у відповідях нижче.