Колись мені порадили, що програма C ++ повинна врешті-решт охопити всі винятки. В той час міркування полягали в тому, що програми, які дозволяють виняткам вибухати поза межами main()
дивного стану зомбі. Мені це було сказано кілька років тому, і за ретроспективою я вважаю, що спостережуване явище було пов’язане з тривалим генеруванням надзвичайно великих відвалів ядра від проекту, про який йдеться.
У той час це здавалося химерним, але переконливим. Було абсолютно безглуздо, що C ++ має "карати" програмістів за те, що вони не вибирають всіх винятків, але свідчення, що передували мені, здавались, це підтверджують. Для проекту, про який йдеться, програми, які викидають невдалі винятки, здаються, вступають у дивне зомбі-стан - або, як я підозрюю, що це було зараз, процес посеред небажаного дампівного ядра, як правило, важко зупинити.
(Для всіх, хто цікавиться, чому це не було більш очевидним у той час: Проект генерував велику кількість результатів у декількох файлах з декількох процесів, які фактично затіняли будь-яке aborted (core dumped)
повідомлення, і в цьому конкретному випадку після смертельної експертизи основних відвалів не було Важлива методика налагодження, тому основні демпінги не задумувались над проблемами. Проблеми з програмою зазвичай не залежали від стану, накопиченого за багато подій протягом тривалої програми, а, скоріше, від початкових вкладів у програму короткотривалої роботи (< 1 годину), тому практичніше було просто перезапустити програму з тими ж входами з налагодження або в налагоджувачі, щоб отримати більше інформації.)
Наразі я не впевнений, чи є якась основна перевага чи недолік вилучення винятків виключно з метою запобігання вилученням виключень main()
.
Невелика перевага, яку я можу подумати за те, що дозволяє виняткам перекинутись в минуле, main()
- це те, що це призводить до того, що результат std::exception::what()
буде надруковано на термінал (принаймні, з gcc, складеними програмами в Linux). З іншого боку, цього доцільно досягти, замість того, щоб набрати всі винятки, отримані з std::exception
та надрукувати результат, std::exception::what()
і якщо бажано надрукувати повідомлення за винятком, який не випливає з std::exception
цього, воно повинно бути спіймане перед від'їздом main()
, щоб надрукувати повідомлення.
Скромний недолік, який я можу подумати за те, що дозволяє виняткам перекинутись в минуле, main()
- це те, що можуть утворюватися небажані основні звалища. Для процесу, що використовує великий об'єм пам'яті, це може бути неприємністю, а для контролю поведінки ядра демпінгу з програми потрібні спеціальні виклики ОС. З іншого боку, якщо бажаний дамп і вихід ядра, то це може бути досягнуто в будь-який час шляхом виклику, std::abort()
а вихід без основного дампа може бути досягнутий у будь-який час шляхом виклику std::exit()
.
Анекдотично, я не думаю, що я ніколи не бачив what(): ...
повідомлення за замовчуванням, надруковане широко розповсюдженою програмою після збоїв.
Які, якщо такі є, є сильними аргументами за чи проти того, щоб дозволити виняткам C ++ перевершити минуле main()
?
Редагувати: На цьому сайті є багато загальних питань, що стосуються обміну винятками. Моє запитання стосується виключно винятків C ++, з якими не вдається обробитись, і це стало до кінця main()
- можливо, повідомлення про помилку можна надрукувати, але це негайно показати помилку зупинки.