LINUX.ORG.RU

Все ли исключения в C++ - потомки std::exception?

 ,


0

3

Понятно, что можно выбросить любой тип, хоть char*; я не говорю о хелловорлдах, написанных школьниками.

Знаете ли вы real-world проекты, где выбрасываются исключения, не порожденные от std::exception?

MFC? Конечно, можно полагать, что все исключения унаследованы от std::exception, но всё равно полезно иметь catch(...) обработчик на самом высоком уровне, если не хочешь, чтобы твоя программа просто падала, когда выбросится что либо неожиданное.

rupert ★★★★★
()

все ли строки в C++ это std::string?

SUBJ

DELIRIUM ☆☆☆☆☆
()

Всё зависит от упоротости текущего разработчика. Если даже сейчас в сферическом проекте таких исключений нет, то никто не гарантирует, что их не будет в будущем.

n0044h
()

хоть char*

Вот тут есть поле для дискуссии. throw может вызвать copy ctor. Что для указателя ты вызывать будешь?

UVV ★★★★★
()

Уже не помню, как оно было в MFC и было ли вообще. А вот среди того, с чем доводилось сталкиваться в последние лет десять, вспоминается разве что OTL. Тамошний класс otl_exception по умолчанию ни от чего не наследуется. Но можно использовать макросы OTL_EXCEPTION_DERIVED_FROM+OTL_EXCEPTION_HAS_MEMBERS или OTL_EXCEPTION_IS_DERIVED_FROM_STD_EXCEPTION чтобы сделать otl_exception наследником std::exception (или любого другого определенного в STL класса исключений).

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

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

А остаться в неопределенном состоянии из-за подавленного исключения - типа ок? Такое отловленное исключение вообще ничего не скажет о том, откуда оно и почему. IMHO в таких случаях как раз лучше падать с дампом и потом разбираться.

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

И остаться не неосвобожденными ресурсами.

If no matching handler is found in a program, the function terminate()

(_except.terminate_) is called. Whether or not the stack is unwound before calling terminate() is implementation-defined.

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

Не согласен. Кейс:

Твоё api - дергает пользовательский коллбэк.

Что лучше - упасть, или таки сказать пользователю ай яй яй?

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

Что лучше - упасть, или таки сказать пользователю ай яй яй?

А что вообще можно сказать пользовалелю на исключение неизвестного типа? И что программа должна пытаться делать дальше? Логично свернуть стек и закрыться. Так стандартное поведение необработанного исключения делает то же самое. Плюс в нормальных ОС диалог пользователю показывается.

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

Это, если пользователь - один.

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

pon4ik ★★★★★
()

Наследоваться от std::exception это даже не правило хорошего тона. Хотя бы потому что задекларированные исключения в функциях всё равно должны быть обработаны специальными блоками, а не неким абстрактным catch (const std::exception &), который максимум может ошибку в лог записать, а что делать дальше ему неведомо. Наследоваться от std::exception (и его производных) можно чтобы не городить огород, когда тебя устраивает уже готовая семантика разделения исключений на logic_error, runtime_error и прочие готовые к использованию классы.

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

Походу в новых версиях убрали: в TAO/NEWS пишут, что в 1.5.6 и 1.5.7 все макросы выпилили.

Но таки классы свои есть, например:

TAO/tao/Exception.h
DELIRIUM ☆☆☆☆☆
()

LuaJIT, будучи по дефолту собранным с dwarf2, кидает char* (ванильный Lua хз, там sjlj из-за анси). Другие эксцепшены он ловит и презентует как «c++ exception». Объектив-Си эксцепшены это NSException, в последнее время допустимо кидать id, чаще всего NSString. В общем-то исключения это не исключительно крестовое изобретение и/или механизм, и в гетерогенной среде ты будешь ловить что угодно, кроме этого вашего std::exception.

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

Походу в новых версиях убрали: в TAO/NEWS пишут, что в 1.5.6 и 1.5.7 все макросы выпилили.

Не надо путать ACE и TAO.

ACE — это базовая библиотека, позволяющая абстрагироваться от системно-зависимого уровня.

TAO — это реализация CORBA, в которой используется ACE в качестве базового слоя.

И за ACE, и за TAO стоят одни и те же люди, но это разные программные продукты. А исключения в TAO есть потому, что они определены в самой CORBA. Ну, насколько я помню, первый стандарт отображения CORBA-to-C++ был выпущен еще до выхода стандарта C++98. Сейчас есть CORBA-to-C++11, которая реализуется TAOX11. Там, AFAIK, исключения уже наследуются от std::exception.

eao197 ★★★★★
()

Знаете ли вы real-world проекты, где выбрасываются исключения, не порожденные от std::exception?

Glib::Exception

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

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

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

Мне кажется если одно из условий работы сервиса стабильная работа

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

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

И остаться не неосвобожденными ресурсами.

Это какие еще такие неосвобожденные ресурсы? ОС подметет и память, и дескрипторы.

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

Твоё api - дергает пользовательский коллбэк.

Что лучше - упасть, или таки сказать пользователю ай яй яй?

1. Так пользовательский или программистский?

2. Вызов 3-rd party code всегда обязан быть обрамлен в catch(...) (кроме отладочного режима/сборки для этих самых 3-rd party).

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

Несброшенные кеши, неудаленные временные файлы или таблички, например. Да мало ли что.

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

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

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

Но с красивым иной раз жить проще.

Красивым, но без дампа? Не-не-не, спасибо. Я такого уже наелся на практике. Когда на критический баг есть только лог «unhandled exception in the main thread» и все, что можно - сказать «Сори, только если найдете репро».

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

тс просил привести пример, я привел

glib вполне себе реальный проект, который многие используют

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

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

MFC? Конечно, можно полагать, что все исключения унаследованы от std::exception, но всё равно полезно иметь catch(...) обработчик на самом высоком уровне, если не хочешь, чтобы твоя программа просто падала, когда выбросится что либо неожиданное.

Ну да, пускай она просто плюнет в консоль ex.what() и тихо завершится без уведомления пользователя.

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)

Я всегда наследуюсь от Exception или RuntimeException.

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

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

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

2. Вызов 3-rd party code всегда обязан быть обрамлен в catch(...)

Весьма спорно. Что это вообще даст? Ты же сам за дампы ратуешь, этот код ведь может и у нас где-то память расстрелять, ну поймали исключение, а потом упадёт программа хз где.

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