2013-03-15 3 views
3

GCC (GCC) 4.5.3Что без исключения catchable

GNU GDB (GDB) 7.5.50.20130309-резюме (Cygwin-специальное)

Netbeans 7,3

У меня есть некоторые проблемы ловли SIGSEGV, исключение сегментации в моем коде. Трюк не поймает его (код ниже). Является ли это непривлекательным исключением? Есть ли способ поймать его? (И, конечно) Что я сделал не так?

искусство

string SlipStringOp::dump(const SlipCell& X) const { 
    stringstream pretty; 
    PTR ptr = *getPtr(X); 

    pretty << "[string ] " << dumpLink(X) << " = " 
      << setfill('0') << setw(8) << hex << ptr 
      << " -> "; 
    try { 
     pretty << ptr->dump(); 
    } catch(exception& e) { 
     pretty << e.what(); 
     postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer."); 
    } catch(...) { 
     postError(SlipErr::E3023, "SlipStringOp::dump", "", "Deletion of cell deleted the pointer."); 
    } 
    return pretty.str(); 
}; // string SlipStringOp::dump(const SlipCell& X) const 
+5

сигналы не являются исключениями :) –

+0

Любой способ поймать сигнал? –

+0

Если вы действительно хотите знать, что вы сделали не так, начните с предоставления [SSCCE] (http://meta.stackexchange.com/questions/22754/) – Nemo

ответ

7

SIGSEGV не является исключением; это сигнал. Доступ к недопустимому адресу памяти известен как ошибка сегментации. Когда ваша программа сделает это, операционная система отправит вашему процессу сигнал SIGSEGV. Обработчик по умолчанию для этого сигнала немедленно прекратит процесс.

Вы can intercept a signal, но это не сигнал, с которым вам следует обращаться. Если ваша программа вызывает ошибку сегментации, у нее есть ошибка, без сомнения.

Если вы выделили ошибку сегментации на строку pretty << ptr->dump();, я бы предположил, что проблема в том, что проблема ptr не указывает на действительный объект. Альтернативно, функция dump делает что-то плохое.

Не попытайтесь исправить это, обработав сигнал. Do устраните это, убедившись, что ваша программа не вызывает ошибку сегментации.

1

Здесь есть два вопроса. Во-первых, почему вы получаете SIGSEGV? Вероятно, здесь недостаточно кода, чтобы мы могли сказать, но ваш вызов ptr-> dump() вызывает ту же самую функцию рекурсивно? ЕСЛИ так, у вас бесконечная рекурсия, и это вызывает ошибку seg.

Второй вопрос заключается в том, как вы захватываете сигнал, на который ответили предыдущие респонденты.

+0

SIGSEGV поднимается, потому что ptr указывает на удаленный объект. Я надеялся сделать автоматическую обработку, поймав сигнал, разместив соответствующее диагностическое сообщение и выйдя из программы. Но я могу (возможно) просто исправить проблему, так что это не происходит «нормально», но тогда пользователь программного обеспечения будет озадачен, когда это произойдет. Ну что ж. Еще один день, другое приключение, еще один ad hoc обработчик ошибок. –

0

Вы создаете исключение из выражения throw. Вы получаете исключение в предложении catch.

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

Любые другие действия и взаимодействия являются системными (то есть не переносимыми).