- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
public class MyFancyException extends Exception {
public MyFancyException(Throwable cause) {
super(cause);
}
static public <X extends Throwable> void foo() throws X {
try {
throw new MyFancyException(new Exception());
}
catch (MyFancyException ex) {
throw (X) ex.getCause();
}
}
public static void main(String[] args) throws IOException {
MyFancyException.<IOException>foo();
}
}
Прекрасный способ отстрелить себе ногу. Метод foo() может кинуть любое исключение, даже если его нет в списке throws
>Прекрасный способ отстрелить себе ногу.
Компилятор предупреждает об этом в строке 12.
Тоже убивает (я думал, что он в compile-time сматерится - но нет, доверяет и убивает лжецов). Но noexcept можно в compile-time проверить и замутить какую-нибудь оптимизацию на основе этого обещания (см. коммент про вектор выше).
Идея может быть и неплохая, но она очень плохо работает с паттернами типа visitor'а (можешь в моей кабинке поискать, есть пример). А во-вторых эту систему жутко абузили, и заставляли ловить все подряд. Например тот же JSONException при генерации json'а, который нахуй никому не сдался.
Тип того. Но оно еще и заставляет их ловить или добавлять в throws вызвавшей функции. В этом и основная трабла ;)
В крестах, кстати, такая фишка тоже была, но ее объявили устаревшей, и замутили вместо нее маркер noexcept, показывающий, что функция никогда и ничего не должна бросать.
Запрет исключения звучит разумнее, но, мне кажется, это больше похоже на пометку для программиста чем на реальный инструмент
throw () было просто пометкой. Можно было прям в ней написать throw и самоубиться :)
Не только. noexcept еще для оптимизаций используется. Например, если конструктор перемещения обещает не кидать исключений (помечен как noexcept), то вектор будет перемещать элементы в новый буфер при реаллоке, иначе - копировать в новый буфер а затем удалять старые.
А за нарушение обещания - смерть.
Прям тюремные понятия: не держишь слово? Опустят или на нож.
Не тот язык назвали «решёткой»
Ты что-то имеешь против бабских аватарок? ^_^