Page 1 of 1
Все предоставляемые плагинам функции помечены как noexcept
Posted: Tue 18 Nov, 2014 23:32
by Shmuel
Code: Select all
drkns 11.09.2014 00:07:10 +0200 - build 4097
1. Все предоставляемые плагинам функции помечены как noexcept и обернуты в try/catch,
т. к. выбрасывание наружу исключений всё равно ни к чему хорошему привести не может.
Нельзя ли пояснить это подробнее?
По моим наблюдениям, одни исключения перестали выбрасываться наружу, другие - не перестали.
Вообще, это несколько тревожно: если раньше баг в плагине, вызывавший исключение, хорошо проявлялся, и его можно было сразу чинить, то теперь мы как бы заметаем сор в угол, прячем под одеяло, и т.п. Или я просто недопонимаю?
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 00:16
by DrKnS
Нельзя ли пояснить это подробнее?
Можно. Исключение - объект языка C++, обрабатывать его в другом модуле можно только если он написан на том же языке, собран тем же компилятором, той же версии и с теми же настройками, иначе это UB.
другие - не перестали
В студию.
теперь мы как бы заметаем сор в угол, прячем под одеяло, и т.п.
В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 08:22
by Shmuel
char *p=NULL; *p=5;
Теперь пример, когда баг перестал ловиться:
void *h=SaveScreen(0,0,-1,-1); RestoreScreen(h); RestoreScreen(h);
DrKnS wrote: В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.
Я бы предпочёл, чтобы падало сразу и с шумом.
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 08:41
by DrKnS
Shmuel wrote: char *p=NULL; *p=5;
Это где такое? В функции Far, предоставленной плагину, да?
Shmuel wrote:
Теперь пример, когда баг перестал ловиться:
Code: Select all
void *h=SaveScreen(0,0,-1,-1); RestoreScreen(h); RestoreScreen(h);
RestoreScreen(h) - это delete(SaveScreen *)h;
Повторное удаление - это UB. Исключение оно выбрасывать не обязано. Если повезёт, можно получить SEH, а можно и не получить.
Пользуйтесь RAII и подобных багов не будет в принципе.
Shmuel wrote: Я бы предпочёл, чтобы падало сразу и с шумом.
Выше написано - это UB. Может падать сразу и с шумом, может тихо портить память и данные где-то совсем в другом месте.
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 08:58
by Shmuel
DrKnS wrote: Это где такое? В функции Far, предоставленной плагину, да?
В
OpenW
, например. Не в функции Far.
DrKnS wrote: Пользуйтесь RAII и подобных багов не будет в принципе.
Обсуждается не то, как избежать определённых багов, а то, как их обрабатывать, если они всё же есть. А они были, есть, и будут.
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 11:50
by zg
Shmuel wrote:В OpenW
, например. Не в функции Far.
а какое это имеет отношение к обсуждаемому изменению?
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 12:38
by HaRT
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 12:58
by zg
HaRT wrote:Shmuel wrote: char *p=NULL; *p=5;
Этот код не имеет прямого отношения к бросанию исключений C++. То есть C++ exception получим лишь в том случае, если в процессе Фара установлен специальный преобразователь из SEH-исключений в Си++-исключения.
ещё раз. какое отношение это имеет к обсуждаемой теме? в указанном патче в try/catch оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно.
Все предоставляемые плагинам функции помечены как noexcept
Posted: Wed 19 Nov, 2014 13:04
by HaRT
zg wrote: оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно
Теперь до меня дошло. Спасибо за разъяснение. Прошу прощения за офтопик.