Error exception handling disabled use fexceptions to enable

I am trying to compile simple code with -fno-exceptions flag. Its giving error. Please let me know how to suppress this. I am using gcc version 4.6.3 Code #include using namesp...

I am trying to compile simple code with -fno-exceptions flag. Its giving error.

Please let me know how to suppress this. I am using gcc version 4.6.3

Code

#include <iostream>
using namespace std;
int main () {
  try
  {
    throw 20;
  }
  catch (int e)
  {
    cout << "An exception occurred. Exception Nr. " << e << 'n';
  }
  return 0;
}

Log

> g++ throw.cc -o out -fno-exceptions
throw.cc: In function ‘int main()’:
throw.cc:10:11: error: exception handling disabled, use -fexceptions to enable
throw.cc:14:56: error: ‘e’ was not declared in this scope

Edit

I have a client code which have lot throws like this. I have to integrate this in my project and I can’t control compilation flags to build(which will come from config which has -fno-exceptions enabled). I wanted a quick work around that I can suggest.

EDIT

I found a workaround see below for my answer.

asked Aug 19, 2015 at 11:44

Kiran's user avatar

KiranKiran

4891 gold badge5 silver badges16 bronze badges

2

You cannot use -fno-exceptions flag with program, that use exceptions (try/catch/throw).

Quote from gcc manual

Before detailing the library support for -fno-exceptions, first a
passing note on the things lost when this flag is used: it will break
exceptions trying to pass through code compiled with -fno-exceptions
whether or not that code has any try or catch constructs. If you might
have some code that throws, you shouldn’t use -fno-exceptions. If you
have some code that uses try or catch, you shouldn’t use
-fno-exceptions.

answered Aug 19, 2015 at 11:47

ForEveR's user avatar

ForEveRForEveR

54.7k2 gold badges114 silver badges133 bronze badges

5

You can’t compile a program with this flag if you throw exceptions in your own code. The -fno-exceptions flag does the following:

  1. All exception handling in STL libraries are removed; throws are replaced with abort() calls
  2. Stack unwind data and code is removed. This saves some code space, and may make register allocation marginally easier for the compiler (but I doubt it’ll have much performance impact). Notably, however, if an exception is thrown, and the library tries to unwind through -fno-exceptions code, it will abort at that point, as there is no unwind data.

This will, effectively, turn all exceptions into abort()s, as you would like. Note, however, that you will not be allowed to throw — any actual throws or catchs in your code will result in a compile-time error.

Community's user avatar

answered Aug 19, 2015 at 11:52

Victor Polevoy's user avatar

Victor PolevoyVictor Polevoy

14.8k15 gold badges88 silver badges157 bronze badges

I found a workaround. Except for the «e» in the catch block the code can be rewritten like

#include <iostream>
using namespace std;
int main () {
  __try
  {
    __throw_exception_again 20;
  }
  __catch (int e)
  {
    cout << "An exception occurred." << 'n';
  }
  return 0;
}

and can be compiled with

g++ throw.cc -o out -fno-exceptions.

answered Aug 19, 2015 at 13:00

Kiran's user avatar

KiranKiran

4891 gold badge5 silver badges16 bronze badges

1

PlatformIO Community

Loading

Here it is a more comprehensive list of flags to enable exceptions on all platforms builds:

{
"conditions": [
          [ "OS=='linux'", {
              "cflags+": [ "-std=c++11", "-fexceptions" ],
              "cflags_c+": [ "-std=c++11", "-fexceptions" ],
              "cflags_cc+": [ "-std=c++11", "-fexceptions" ],
          }],
          [ "OS=='freebsd'", {
              "cflags+": [ "-std=c++11", "-fexceptions" ],
              "cflags_c+": [ "-std=c++11", "-fexceptions" ],
              "cflags_cc+": [ "-std=c++11", "-fexceptions" ],
          }],
          [ "OS=='mac'", {
              "cflags+": [ "-stdlib=libc++" ],
              "xcode_settings": {
                  "OTHER_CPLUSPLUSFLAGS" : [ "-std=c++11", "-stdlib=libc++", "-pthread" ],
                  "OTHER_LDFLAGS": [ "-stdlib=libc++" ],
                  "GCC_ENABLE_CPP_EXCEPTIONS": "YES",
                  "MACOSX_DEPLOYMENT_TARGET": "10.7",
                  "CLANG_CXX_LANGUAGE_STANDARD":"c++11",
                  "CLANG_CXX_LIBRARY": "libc++"
              },
          }],
          [
          "OS=='win'", {
            "cflags": [
              "-Wall"
            ],
            "defines": [
              "WIN"
            ],
            "msvs_settings": {
              "VCCLCompilerTool": {
                "ExceptionHandling": "2",
                "DisableSpecificWarnings": [
                  "4244"
                ],
              },
              "VCLinkerTool": {
                "LinkTimeCodeGeneration": 1,
                "OptimizeReferences": 2,
                "EnableCOMDATFolding": 2,
                "LinkIncremental": 1,
              }
            }
          }]
      ]
}

Содержание

  1. Arduino.ru
  2. Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru
  3. forum.arduino.ru
  4. try catch
  5. Arduino.ru
  6. Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru
  7. forum.arduino.ru
  8. Программирование
  9. Оператор For для новичка
  10. Как правильно сравнить строку типа string
  11. Обработка прерываний
  12. Скетч нескольких ШД
  13. Подача нужного сигнала на вход и действие на выход.
  14. Точные показания с датчика (микрофон)
  15. Вопрос по 74HC595
  16. try catch
  17. Ethernet shield MAC уровень — реально?
  18. Использование String внутри switch
  19. C++ exception handling build/compile errors. #231
  20. Comments

Arduino.ru

Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru

forum.arduino.ru

try catch

При использовании блоков try catch вылазит вот такая ошибка: “error: exception handling disabled, use -fexceptions to enable”, куда нужно вводить этот – fexceptions чтобы все заработало?

Код ошибки целиком:

time.ino: In function ‘bool time_set(char*)’:

time:18: error: expected type-specifier before ‘)’ token

time:18: error: exception handling disabled, use -fexceptions to enable

expected type-specifier before ‘)’ token

По-моему, catch с пустыми скобками использовать нельзя. Нужно или указывать конкретный тип

или писать многоточие, для обработки всего, что ещё не обработано

-fexceptions, насколько я помню, добавляется в файле platform.txt.
Только версия IDE должна быть не слишком старой — в старых такого файла не было.

Но самое обидное то, что после успешной компиляции линкер всё равно выдаст ошибку — будет ругаться, что в файлах есть ссылки на функции, которые он не нашёл. В общем, не реализована в avr-gcc обработка исключений. Если кто-то в этом хорошо соображает — пожалуйста, можно дописать недостающие функции самостоятельно. 🙂

Вот, всё что знал. Может быть и ошибаюсь — давно этим не занимался, за это время могло что-то измениться.

Мне просто очень интересно зачем Вам в микроконтроллере try/catch ?

Вы собрались писать код который будет сам кидать и ловить исключения ?

Если кто-то в этом хорошо соображает — пожалуйста, можно дописать недостающие функции самостоятельно. 🙂

Низя ни разу. Исключение — один из видов прерывания, только не от таймера или дерганья ноги, а от програмного события. Например попытка обратится по указателю за пределы памяти. Что делать — неизвестно, вот и вызывается прерывание, в нем должны разобратся с проблемой. И если процессор не поддерживает этот механизм и/или ОС не умеет обработать исключения — их не будет. На микроконтроллерах — не сильно и хотелось.

Низя ни разу. Исключение — один из видов прерывания, только не от таймера или дерганья ноги, а от програмного события. Например попытка обратится по указателю за пределы памяти. Что делать — неизвестно, вот и вызывается прерывание, в нем должны разобратся с проблемой. И если процессор не поддерживает этот механизм и/или ОС не умеет обработать исключения — их не будет. На микроконтроллерах — не сильно и хотелось.

Вообще реально мимо, даже молоко не задели. 🙂

Исключения чистая фишка языка, и никакого отношения к прерываниям не имеет.

Более того Вы просто не реально удивитесь когда узнаете что SEGMENTATION FAULT, про который вы говорите, вообще не подлежит обработке через исключения если строго следовать стандартам, просто мелкомягкие нехило поработали что бы сделать для вас прослойку которая пытается решить эту проблему, причем это работает нормально далеко не всегда. Еще хуже дела обстоят с перехватом исключений типа OUT OF MEMORY ( вообще отдельная песня ).

В линухе ( что бы он сдох не родившись ) надо обрабатывать сигналы для поимки всего подряд даже для деления ноль (если мне не изменяет память). И никто даже не пытается транслировать это в исключения.

Так что исключения это не обработка системных ошибок, это скорее механизм быстрого всплытия с глубины если с вашим кислородным балоном что-то случилось, именно с вашим балоном, а не тем что предоставила вам ОС/Железо.

Исключения чистая фишка языка, и никакого отношения к прерываниям не имеет.

Более того Вы просто не реально удивитесь когда узнаете что SEGMENTATION FAULT, про который вы говорите, вообще не подлежит обработке через исключения если строго следовать стандартам, просто мелкомягкие нехило поработали что бы сделать для вас прослойку которая пытается решить эту проблему, причем это работает нормально далеко не всегда. Еще хуже дела обстоят с перехватом исключений типа OUT OF MEMORY ( вообще отдельная песня ).

В линухе ( что бы он сдох не родившись ) надо обрабатывать сигналы для поимки всего подряд даже для деления ноль (если мне не изменяет память). И никто даже не пытается транслировать это в исключения.

Так что исключения это не обработка системных ошибок, это скорее механизм быстрого всплытия с глубины если с вашим кислородным балоном что-то случилось, именно с вашим балоном, а не тем что предоставила вам ОС/Железо.

А как » механизм быстрого всплытия с глубины » реализован, из всей глубины через 100500 уровней вложения подпрограмм?

Читать напимер здесь — http://kit.znu.edu.ua/eDoc/Arch/Pentium/orl24.html. И мелкомягкие там не причем, они только обернули это все в TRY. CATCH. А заложено как раз в железе, конкретно у Intela с 286 (правда криво), и вполне жизнеспособно в IAR-32 и позже.. Хотите SEGMENTATION FAULT — INT11. Те которые генерируются програмно — INTO и BOUND.

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

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

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

Исключения чистая фишка языка, и никакого отношения к прерываниям не имеет.

Более того Вы просто не реально удивитесь когда узнаете что SEGMENTATION FAULT, про который вы говорите, вообще не подлежит обработке через исключения

А вот и не подерётесь! 🙂

Оба правы, почти.

gregoryl чуть-чуть правее. Вот только насчёт SEGMENTATION FAULT. не знаю, по-моему как раз через исключения — как же ещё?

Logik тоже во всём прав, но он рассказывает совсем не про те исключения, о которых спрашивал ТС.

А ТС, как раз, хочет получить структурную обработку исключений. или структурированную что ли.
SEH, короче, по-иностранному. Кто её придумал — не помню, но кажется действительно майкрософтовцы.

К аппаратным особенностям процессора/контроллера она никакого отношения не имеет, и реализуется (или не реализуется) чисто программно, конкретным компилятором С/С++.

А никто и не говорит, что оно очень уж быстрое. Быстрое оно, скорее, для программиста — то есть, просто удобное, именно для всплытия через 100500 уровней.

Реализуется это именно как всплытие — т.е. не одним прыжком, а последовательно, через все уровни.
И заниматься составлением всех этих цепочек вызовов и исключений, а потом ещё и их «распутыванием», должны функции, которых в AVR-овской реализации нет, или пока нет.

Вы собрались писать код который будет сам кидать и ловить исключения ?

А что, иногда хочется! 🙂

Но в общем, да — тоже считаю, что каждому контроллеру свои задачи. Думаю, раз не реализовали — значит не очень то оно удобно на этих AVR8 реализуется. Может, места занимает неоправданно много.

Могу порекомендовать функции setjmp/longjmp. С ними можно делать что-то, вполне похожее на эти исключения, особенно если написать соответствующие макросы для try/catch/throw.

А если уж ещё дальше оффтопить. STM32 — и всё, нет больше этой проблемы.
Дороже всего на несколько центов — но компилятор там вполне серьёзный, и исключения присутствуют в полном объёме.

Только не подумайте, что агитирую за полный переход. Сам люблю эти AVR-ки, почему-то.
Но, ещё раз — иногда проще выбрать другой контроллер, чем лепить, например, какой-нибудь «Software UART».

Исключения чистая фишка языка, и никакого отношения к прерываниям не имеет.

Более того Вы просто не реально удивитесь когда узнаете что SEGMENTATION FAULT, про который вы говорите, вообще не подлежит обработке через исключения

А вот и не подерётесь! 🙂

Оба правы, почти.

gregoryl чуть-чуть правее. Вот только насчёт SEGMENTATION FAULT. не знаю, по-моему как раз через исключения — как же ещё?

Logik тоже во всём прав, но он рассказывает совсем не про те исключения, о которых спрашивал ТС.

А ТС, как раз, хочет получить структурную обработку исключений. или структурированную что ли.
SEH, короче, по-иностранному. Кто её придумал — не помню, но кажется действительно майкрософтовцы.

К аппаратным особенностям процессора/контроллера она никакого отношения не имеет, и реализуется (или не реализуется) чисто программно, конкретным компилятором С/С++.

А никто и не говорит, что оно очень уж быстрое. Быстрое оно, скорее, для программиста — то есть, просто удобное, именно для всплытия через 100500 уровней.

Реализуется это именно как всплытие — т.е. не одним прыжком, а последовательно, через все уровни.
И заниматься составлением всех этих цепочек вызовов и исключений, а потом ещё и их «распутыванием», должны функции, которых в AVR-овской реализации нет, или пока нет.

О ещё представитель сообщества свидетелей исключений без аппаратной поддержки!

Я для кого писал в первом сообщении в теме о необходимости кроме аппаратной поддержки еще и поддержки в ОС? Вот это и есть (structured exception handling, SEH) но его наличие по барабану без аппаратного механизма прерывания. Читайте например здесь http://www.e-reading.club/chapter.php/89563/92/Russinovich,_Solomon_-_1.Vnutrennee_ustroiistvo_Windows_(gl._1-4).html

там и про векторы прерываний, и про структурную обработку. Для ленивых — цитата » Учтите: хотя обработка исключений возможна через расширения языка программирования (например, с помощью конструкции_try в Microsoft Visual C++), она является системным механизмом и поэтому не зависит от конкретного языка.

B системах типа x86 все исключения имеют предопределенные номера прерываний, прямо соответствующие записям в IDT, ссылающимся на обработчики ловушек конкретных исключений. «

Поймите правильно, я знаю как это работает. В отличии от Вас. Убедить меня голыми словами не получится. Какие ещё не те исключения?!

И в данном вопросе меня интересует только один момент — источник стойкого убеждения что » К аппаратным особенностям процессора/контроллера она никакого отношения не имеет, и реализуется (или не реализуется) чисто программно, конкретным компилятором С/С++. » Откуда Вы это взяли вообще?

Если Вы и далее в этом уверены, то раскажите что происходит в системе непосредственно при исполнении машинной команды обратившейся за пределы доступного сегмента. например в программе идут подряд команды and [bx+6F],dh и jb 0087 , первая обращается за пределы. Далее что?.

ПС. Быстро раскручиваются исключения или нет — «мопед не мой», слово «быстро» из цитаты.

ППС. В более навороченных чем наны и микры ардуиновских контроллерах аппаратная поддержка присутствует, тех же STMах. И соответственно обработка исключений есть, на том же компиляторе gcc.

Источник

Arduino.ru

Регистрация новых пользователей и создание новых тем теперь только на новом форуме https://forum.arduino.ru

forum.arduino.ru

Программирование

Оператор For для новичка

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

хочу что бы она пищала громче, чаще и тоньше если расстояние становится ближе.

Ни че не понимаю, помогите плииииз. )))

Как правильно сравнить строку типа string

Добрый день всем! Сразу скажу, что я не С++, а Delphi прогер, но жизнь заставляет изучать С++ и начал я сразу с языка для Ардуино. Открыл на днях коробочку с платкой и написал небольшой скетч. Суть в том, чтобы АрдуинаМега приняла данные с USB порта, а потом разобрала что нужно ей сделать. ВРоде все просто звучит, получил строковый код 1 — включил порт, получил 0 — отключил порт, но не могу заставить ее сравить строки )))

Обработка прерываний

Возникли проблемы с обработкой внешних прерываний.

Висит щелевой оптодатчик в качестве счетчика. Его выход подключен к 2 пину Arduino Mega 2560.

Необходимо посчитать сколько было импульсов от этого счетчика.

Делаю простейший скетч

Скетч нескольких ШД

Подача нужного сигнала на вход и действие на выход.

Желаю всем здравствовать.

В научных целях возникла такая необходимость. Есть устройство, которое считывает сигнал, форму этого сигнала мы получили при помощи осциллографа. Теперь стоит задача — чтобы ардуино, когда получит на вход этот конкретный сигнал, на выходе выполнял какое то действие — не важно какое, например зажигал светодиод. Возможно ли это?

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

Точные показания с датчика (микрофон)

Всем доброго времени суток! Нужна помощь в программировании. Собираюсь выводить показания микрофона с предусилителем на монитор порта, создал такой код:

Вопрос по 74HC595

Начал разбираться с микросхемой сос двиговым регистром.

Нашел совсем простенький учебный код :

try catch

При использовании блоков try catch вылазит вот такая ошибка: “error: exception handling disabled, use -fexceptions to enable”, куда нужно вводить этот – fexceptions чтобы все заработало?

Код ошибки целиком:

time.ino: In function ‘bool time_set(char*)’:

time:18: error: expected type-specifier before ‘)’ token

time:18: error: exception handling disabled, use -fexceptions to enable

Ethernet shield MAC уровень — реально?

Товарищи, кто возился с эзернет шилдом? Задача такая: принять пакет отправленный на мак адрес ардуины, декодировать, послать в ШИМ. В пакете 8 байт значений для ШИМ. Вот я думаю, пропустит ли W5100 мак уровень в ардуину или он сам его обрабатывает?

Использование String внутри switch

Помогите имеется некая функция которая возвращает тип данных String, мне нужно проверить это значение со списком уже известных значений и в зависимости от этого выбрать дальнейшую функцию, однако switch не позволяет использовать переменные типа String. Подскажите как выйти из этой ситуации?

Источник

C++ exception handling build/compile errors. #231

Hello, I build from the bash and have cpp_utils in my components folder as instructed, when going make flash monitor it starts building but when it gets to HttpServer it throws as follows:

The text was updated successfully, but these errors were encountered:

Please check if you have enabled exception handling in menuconfig:
make menuconfig

menuconfig->compiler options-> C++ exceptions

Issue #232 was just created and code changed against it. Now when we try and compile code that expects C++ exception handling to be present and it isn’t switched on, the compilation checks for it to be on and, if note, logs a more instructive message telling the user to switch on with some hints on how to do that.

Hello Neil, but how can we do the «make menuconfig». If I try in esp32-snippets/cpp_utils the system answer
«There is no rule to the objective ‘menuconfig’»

You need to to use make menuconfig in your project folder, not in cpp_utils.

thanks, but I am Arduino user and compile with makefile.arduino in cpp_utils and the failure is on the Arduino side but referred to BLE library. I try to do the menuconfig on other projects but didn’t work.

@jestebanes Have a read through this issue — #228

In the latest BLE C++ classes we started to exploit C++ exception handling. In the latest ESP-IDF, Espressif have given us the ability to throw an exception. This is great. It means that code can throw an exception if it fails rather than return a failing return code which must always be checked. If your read #228 you will find that although exception handling is now part of ESP-IDF, it is not turned on by default. The Arduino-ESP32 apparently ships a pre-compiled version of the ESP-IDF as part of its distribution. If one is using Arduino IDE, then one uses that ESP-IDF . which has not yet had exception handling switched on. Mr @me-no-dev believes he will be able to turn that on in a future release of the Arduino-ESP32 libraries. In the interim, your choices are:

Источник

I’m using a port of the STL found here and trying to debug with a simple try{...}catch{...} loop. When compiling with the Arduino IDE, I get the error message

exception handling disabled, use -fexceptions to enable.

I’m not quite sure what this means. Can the Arduino simply not support exceptions? Or is -fexceptions a compiler flag I can enable?

asked May 14, 2019 at 11:58

Snail Cadet's user avatar

2

Arduino is a very limited platform, and handling exceptions requires quite a bit of hidden code to properly unwind the stack wherever the exception occurs.

So the default is to turn it off and teach users to not use exceptions in arduino and instead other type of error handling.

answered May 14, 2019 at 12:11

ratchet freak's user avatar

ratchet freakratchet freak

3,2691 gold badge10 silver badges12 bronze badges

2

Понравилась статья? Поделить с друзьями:
  • Error exception handling console input java io ioexception неверный дескриптор
  • Error exception handlers complete
  • Error exception access violation blender
  • Error event operation timed out 60 for i o session closing it
  • Error event id 7000