Все предоставляемые плагинам функции помечены как noexcept

Разработка Far.
Post Reply
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Все предоставляемые плагинам функции помечены как noexcept

Post by Shmuel »

Code: Select all

drkns 11.09.2014 00:07:10 +0200 - build 4097

1. Все предоставляемые плагинам функции помечены как noexcept и обернуты в try/catch,
   т. к. выбрасывание наружу исключений всё равно ни к чему хорошему привести не может.
Нельзя ли пояснить это подробнее?
По моим наблюдениям, одни исключения перестали выбрасываться наружу, другие - не перестали.

Вообще, это несколько тревожно: если раньше баг в плагине, вызывавший исключение, хорошо проявлялся, и его можно было сразу чинить, то теперь мы как бы заметаем сор в угол, прячем под одеяло, и т.п. Или я просто недопонимаю?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Все предоставляемые плагинам функции помечены как noexcept

Post by DrKnS »

Нельзя ли пояснить это подробнее?
Можно. Исключение - объект языка C++, обрабатывать его в другом модуле можно только если он написан на том же языке, собран тем же компилятором, той же версии и с теми же настройками, иначе это UB.
другие - не перестали
В студию.
теперь мы как бы заметаем сор в угол, прячем под одеяло, и т.п.
В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Все предоставляемые плагинам функции помечены как noexcept

Post by Shmuel »

DrKnS wrote: В студию.
char *p=NULL; *p=5;

Теперь пример, когда баг перестал ловиться:
void *h=SaveScreen(0,0,-1,-1); RestoreScreen(h); RestoreScreen(h);
DrKnS wrote: В каждом catch блоке можно обнаружить комментарий "// TODO: log". Когда придёт время, он будет заменён соответствующей диагностикой.
Я бы предпочёл, чтобы падало сразу и с шумом.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Все предоставляемые плагинам функции помечены как noexcept

Post 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. Может падать сразу и с шумом, может тихо портить память и данные где-то совсем в другом месте.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Все предоставляемые плагинам функции помечены как noexcept

Post by Shmuel »

DrKnS wrote: Это где такое? В функции Far, предоставленной плагину, да?
В OpenW, например. Не в функции Far.
DrKnS wrote: Пользуйтесь RAII и подобных багов не будет в принципе.
Обсуждается не то, как избежать определённых багов, а то, как их обрабатывать, если они всё же есть. А они были, есть, и будут.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Все предоставляемые плагинам функции помечены как noexcept

Post by zg »

Shmuel wrote:В OpenW, например. Не в функции Far.
а какое это имеет отношение к обсуждаемому изменению?
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Все предоставляемые плагинам функции помечены как noexcept

Post by HaRT »

Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Спрятан офтопик
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Все предоставляемые плагинам функции помечены как noexcept

Post by zg »

HaRT wrote:
Shmuel wrote:
DrKnS wrote: В студию.
char *p=NULL; *p=5;
Этот код не имеет прямого отношения к бросанию исключений C++. То есть C++ exception получим лишь в том случае, если в процессе Фара установлен специальный преобразователь из SEH-исключений в Си++-исключения.
ещё раз. какое отношение это имеет к обсуждаемой теме? в указанном патче в try/catch оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

Все предоставляемые плагинам функции помечены как noexcept

Post by HaRT »

zg wrote: оборачиваются функции, предоставляемые фаром плагину. код самого плагина обёрнут давно
Теперь до меня дошло. Спасибо за разъяснение. Прошу прощения за офтопик.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

Return to “Development”