Гледах ги вече тези примери, и подобни на тях.
Конструкцията която дискутира автора на въпроса в линка е най-близо до ума, макар и да се оказва неправилна и неработеща (а и throw там се вика в неизвестен контекст). Конструкцията която предлага последният отговор (1 по номерацията) работи, но само в ограниченият вариант на примера. В примера throw се вдига в контекста на нивото на try блока, тоест обработката ще активира конструкторите на това ниво и надолу. Но ако в try е извикана функция fun1(), заела ресурси, и тя вика функция fun2() в която се активира сигнала, в тоя пример няма да се викат деструкторите във fun1() и fun2(), а само на нивото на try. За да работи както се предлага, всяка функция трябва да се облече със свое повикване на signal(), setjmp() и try-catch блок, което е прекалено. Самият компилатор прави подобно скрито обличане за нормалните ексцепшъни, ама на ръка да го повтаряш само заради сигналите, не ми дава сърце. Над 16000 функции има в проекта, поне 10000 ще са потенциално засегнати...
Затова търся нещо по-човешко, ако има. Прежалил съм се вече и за решението в примера, макар да се губят ресурси...
За разлика от главата, стомахът се усеща когато е празен...
|