- 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
guest 27.06.2014 17:46 # 0
3.14159265 27.06.2014 18:42 # +1
>Прекрасный способ отстрелить себе ногу.
Компилятор предупреждает об этом в строке 12.
bormand 27.06.2014 19:21 # 0
Soul_re@ver 27.06.2014 19:40 # +3
3.14159265 27.06.2014 19:42 # 0
bormand 27.06.2014 19:48 # +1
Тоже убивает (я думал, что он в compile-time сматерится - но нет, доверяет и убивает лжецов). Но noexcept можно в compile-time проверить и замутить какую-нибудь оптимизацию на основе этого обещания (см. коммент про вектор выше).
kegdan 27.06.2014 19:20 # 0
bormand 27.06.2014 19:24 # +1
Идея может быть и неплохая, но она очень плохо работает с паттернами типа visitor'а (можешь в моей кабинке поискать, есть пример). А во-вторых эту систему жутко абузили, и заставляли ловить все подряд. Например тот же JSONException при генерации json'а, который нахуй никому не сдался.
kegdan 27.06.2014 19:27 # +1
bormand 27.06.2014 19:29 # 0
Тип того. Но оно еще и заставляет их ловить или добавлять в throws вызвавшей функции. В этом и основная трабла ;)
В крестах, кстати, такая фишка тоже была, но ее объявили устаревшей, и замутили вместо нее маркер noexcept, показывающий, что функция никогда и ничего не должна бросать.
kegdan 27.06.2014 19:32 # 0
Запрет исключения звучит разумнее, но, мне кажется, это больше похоже на пометку для программиста чем на реальный инструмент
bormand 27.06.2014 19:34 # 0
throw () было просто пометкой. Можно было прям в ней написать throw и самоубиться :)
bormand 27.06.2014 19:46 # +3
Не только. noexcept еще для оптимизаций используется. Например, если конструктор перемещения обещает не кидать исключений (помечен как noexcept), то вектор будет перемещать элементы в новый буфер при реаллоке, иначе - копировать в новый буфер а затем удалять старые.
А за нарушение обещания - смерть.
kegdan 27.06.2014 20:03 # 0
Soul_re@ver 27.06.2014 20:27 # +1
Прям тюремные понятия: не держишь слово? Опустят или на нож.
Не тот язык назвали «решёткой»
kegdan 27.06.2014 21:21 # +1
bormand 27.06.2014 21:54 # 0
Ты что-то имеешь против бабских аватарок? ^_^
kegdan 27.06.2014 21:56 # 0
bormand 27.06.2014 22:01 # +1
kegdan 27.06.2014 22:06 # −1
crastinus 28.06.2014 06:20 # +1
kegdan 28.06.2014 06:37 # 0
bormand 28.06.2014 07:44 # 0
kegdan 28.06.2014 07:57 # 0
guest 27.06.2014 19:25 # 0
guest 28.06.2014 15:06 # −1
7u7 24.08.2021 22:06 # 0
alex_matviichuk 25.08.2021 19:24 # 0