LINUX.ORG.RU

QT + try{} catch(...)


0

0

Привет всем любителям QT! Изучая эту замечательную библиотеку для разработки столкнулся с таким вопросом: можно ли отловить исключение деления на ноль или другие подобные пакости? Вариант типа try { if(i == 5) i = 10/(i-5) } catch(...) { i = 1; }

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

anonymous
Ответ на: комментарий от imp

Понятно. А как же тогда отлавливать все исключения? Просто ошибка в потоке сваливает всю программу. А мне хочется в таком случае закрыть поток с ошибкой, а остальные пускай работают. Есть ли решение такой задачи?

anonymous
()

в винде можно через ЫУР, в микрософтовском компиляторе есть __try __except по этому поводу

anonymous
()
Ответ на: комментарий от anonymous

По-моему исключения работают так (сам никогда не пользую):

void func(int i){
if(i==0)throw(<about_error>);
}

int main(){

try{
func(0);
}
catch(...){
//
}

return 0;
}

staseg ★★★★★
()
Ответ на: комментарий от anonymous

вообще если есть ошибка и приложение падает, то ндо чинить ошибку, отлов эксепшена и закрытие нитки это неправильно и костыли

anonymous
()
Ответ на: комментарий от staseg

Ну а приминительно к твоему случаю - смотри сам. главное, что обработчик запускается "выше" функции/метода, где выполняется код с исключениями.

staseg ★★★★★
()
Ответ на: комментарий от anonymous

лови SIGFPE.

Кстати, почему SIGFPE генерируется при ЦЕЛОЧИСЛЕННОМ делении на ноль?

dilmah ★★★★★
()
Ответ на: комментарий от staseg

throw() не годится - мне не нужно вызывать самому исключения. Просто стоит задача защититься от ошибок в программе - чтоб случайная ошибка в одном из потоков не "убила" всю программу. А Qt потому, что приложение кроссплатформенное. Средств для этого в Qt не нашел - там вообще с исключениями мало что есть, вот и решил спросить на форуме

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

кросс-платформенно отлавливать эксепшены типа деления на 0 и тому подобные - всяко не получится, ибо слишком низкий уровень

anonymous
()
Ответ на: комментарий от Delay

конечно генерятся, тока они не такие как программные эксепшены которые через throw, их процессор генерит, ОС перехватывает и вызывает обработчик

anonymous
()
Ответ на: комментарий от anonymous

епт, когда ж мы матчасть то учить начнем? при делении на 0, нарушении доступа, привелегированной инструкции и другом неправильном поведении программа останавливается и получает сигнал. к исключениям языка это не имеет никакого отношения.

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

anonymous
()
Ответ на: комментарий от anonymous

> привелегированной инструкции и другом неправильном поведении программа останавливается и получает сигнал. к исключениям языка это не имеет никакого отношения.

это в юниксе сигнал, а в винде это называется SEH (Structured _Exception_ Handling), тоесть какбы экспшены но другие

> если ошибка в программе может привести к получению сигнала, такая программа должна завершиться как можно быстрее и громче.

+1

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за совет! Про процессы - это верная мысль. Надо будет проверить. Но тогда возникнут сложности во взаимодействии процессов между собой. Самый простой вариант - сокеты, но он громозкий и медленный, еще вариант через QSharedMemory, но тоже не подарок. Хотя за все нужно платить - если хочешь надежность, то получай ограничения! :)

anonymous
()
Ответ на: комментарий от anonymous

> Самый простой вариант - сокеты,

самый простой -- пайпы

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

> это в юниксе сигнал, а в винде это называется SEH

В винде это называется прерывание, суть та же. А SEH - это заточенный в компилятор способ его придавить и ответить системе, что так и було. Только это не значит, что так и надо поступать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.