Удалить бросания исключения примитивного типа

Игорь Шаповал
Игорь Шаповал

В С++17 удалили с стандарта Dynamic exception specification. Для того чтобы использовать свои исключения, мы должны создать класс и унаследоваться от std::exception. Мы должны переопределить метод what(). Но в стандарте мы можем кидать исключения еще примитивного типа.

try {
  throw 5;
} catch (...) {
   cout << "what does it mean?" << endl;
}

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

try {
  routine();
} catch (const understand_exception& e) {
    cout << "Catch understand exception: " << e.what() << endl;
}

Надеюсь что в стандарт добавят stacktrace. В Java stacktrace используется с исключениями с начала добавления исключения. Хотелось в С++ иметь также. В С++17 начали чистить языковые и библиотечные возможности. Надеюсь что это также попадет под чистку.

 

-1
рейтинг
4 комментария
yndx-antoshkka

Эту идею недавно обсуждали в комитете. На практике - она ничего на даёт, кроме поломок тестового кода с throw 42;. Никаких оптимизаций из неё не выжать - разработчикам стандартных библиотек и компиляторов всё равно придётся тащить старый функционал, выбростить его ни не могут.

yndx-antoshkka
Igor Baidiuk

yndx-antoshkka,
Я бы сказал, возможность кидать что угодно в принципе вредная.

Igor Baidiuk
Игорь Шаповал

Ведь register удалили, тогда зачем это держать. Это ведь поошрения плохого кода.  Я понимаю что С++ разработчику нужна свобода. register ведь ламает обратную совместимость! То тогда зачем это. Я думаю это можно и нужно предлагать на удаления.

Игорь Шаповал
Alexander

Игорь Шаповал,не передёргивайте, пожалуйста. register удалили ввиду того, что миграция кода, где он был, продёт\прошла относительно безболезненно (так как компилятор и сам неплохо занимается распределением регистров). В случае с бросанием простых примитивов миграция кода, там где такое бросают (я ни в коем случае не одобряю подобное), будет скорее всего более болезненной. Я бы предложил собрать статистику по крупным проектам и приложить её к предложению, если Вы готовы написать такое. 

Подход с исследованием не в новинку комитету, и подобное исследование уже проводили в случае с тем же if(a < b < c)

Alexander
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения