cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

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

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +11, -7 Автор идеи: Игорь Шаповал

В С++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 начали чистить языковые и библиотечные возможности. Надеюсь что это также попадет под чистку.

apolukhin commented 3 years ago

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

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

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

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

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