LINUX.ORG.RU

Использование unexpected_handler в GCC


0

0

Пишут, что "Если инициированное исключение отсутствует в спецификации исключений внешней функции, то вызывается функция с именем unexpected()", которую можно переопределить. Определения находятся в файле "exception", но GCC не хочет эти определения видеть. Что нужно сказать компилятору, чтобы он смог работать с этими функциями? Сразу скажу, что этим я пытаюсь сделать переносимый вариант для отлова исключений типа "деление на ноль" или "разадресация нулевого указателя". У MSVC и Borland Compilier есть какие-то свои расширения, но хочется реализовать это стандартными средствами (или я не туда копаю?).

>или я не туда копаю?

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

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

В POSIX-системах есть понятие signal. Через обработку сигналов SIGFPE и SIGSEGV ты можешь сделать то, что хочешь.

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

>Т. е., если писать в расчёте на использование не только в оффтопике, >то про GCC можно забыть?

откуда такой парадоскальный вывод?

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

А фиг его... Опыта мало, вестимо. :-) Ну вот, например, отдаю я в функцию указатель на массив char, в который она должна писать строку. Если этот указатель некорректен -- выскочит access violation, попытка записи в область readonly, и прочее. Есть ли возможность обработать эту ситуацию и на M$Win, и на Linux более-менее однотипно? Про винду знаю -- есть M$-specified extension __try и __except, но это -- только под M$Win и в MinGW GCC они не реализованы.

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

> и на M$Win, и на Linux более-менее однотипно?

смотря насколько однотипно, в обоих системах можно узнать что это случилось, но в Linux информация о том что все плохо поступает асинхронно,а в windows синхроно, именно поэтому ИМХО в gcc нет расширения а-ля __try/__except

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

Так как в M$Win, используя GCC, обработать подобные исключения? И что значит (к чему обязывает) "информация поступает синхронно/асинхронно" применительно к программе?

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

> Так как в M$Win, используя GCC, обработать подобные исключения? И что значит (к чему обязывает) "информация поступает синхронно/асинхронно" применительно к программе?

http://www.ozon.ru/context/detail/id/2419365/

// wbr

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

За сЦылку спасибо, но у меня следующая зряплата заточена на жидкий монитор родителям и три тома Кнута :-). Так что, можно-ли ситуацию по вопросу разъяснить ЩАС?

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

> За сЦылку спасибо, но у меня следующая зряплата заточена на жидкий монитор родителям и три тома Кнута :-).

найти эту книгу в электронном виде на просторах Интернета - полчаса работы и пара метров трафика.

> Так что, можно-ли ситуацию по вопросу разъяснить ЩАС?

нет (c).
иди, учись. хватит прогуливать.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от one_more_hokum

>И что значит (к чему обязывает) "информация поступает синхронно/>асинхронно" применительно к программе?

if (is_event_happend()) {
//делаем что-то
}

синхроно узнаешь что что-то случилось,

void callback()
{
//делаем что-то
}

когда ты что-то не так сделаешь управление будет передано
в функцию "callback" это называется асинхронно


>Так как в M$Win, используя GCC, обработать подобные исключения?

здесь форум о Linux, могу рассказать как сделать в Linux,
а насчет M$Win представления не имею.

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

>Единственное что вспоминается - это sigsetjmp/siglongjmp. И мне >кажется, что это не true

Обработка такого рода обшибок кроме как "извините фатальная ошибка,
и завершение работы" вообще не true,
а подхот с sigsetjmp использует wine

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

> AFAIK, на powerpc-405 деление на 0.0 (и на 0 тоже) не генерит SIGFPE.

Так-же как и на всех остальных PowerPC-based процессорах ;)

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

ну, я использовал только этот. 405 примечателен еще и тем, что у него нет floating point инструкций. И если собирать что-либо без -msoft-float, (и если целевое ядро не эмулирует этих инструкций), вылазит SIGILL.

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