Альтернатива ловить в D? - PullRequest
11 голосов
/ 28 января 2011

Я смотрю Три крутых вещи о D - Дело о языке программирования D и в основном говорится, что не используйте try / catch / finally (о 38марке. 39:30 говорит, что вы не хотите смотретьпри попытке / захвате, который он генерирует), гораздо приятнее использовать область действия (провал) (есть также выход и успех).

Мой вопрос заключается в том, что происходит, когда вы хотите проверить исключение и выполнить действие, основанное на исключении, например, предупредить пользователя о том, что на диске нет места, или пометить URL-адрес как 404 (.NET webclient / webrequest выдаетэто) или повторите попытку позже, если обнаружен код ошибки 500.Как бы я это сделал?я должен использовать try / catch или есть другой способ?

Ответы [ 2 ]

17 голосов
/ 28 января 2011
Операторы

scope позволяют запускать код при выходе из области, в которой вы их объявляете. scope(success) запускается при нормальном выходе из области. scope(failure) запускается при выходе из области действия из-за создаваемого исключения. scope(exit) запускается при выходе из области независимо от того, как вы выходите из области. Ни один из них не дает вам доступа к любым исключениям. Они просто позволяют запускать код при выходе из текущей области в зависимости от того, как вы выходите из этой области.

Таким образом, в сущности, в случаях, когда вы поймаете исключение, сделаете что-то, а затем бросите его снова, не обращая внимания на то, каким на самом деле было исключение, вместо catch можно использовать scope(failure), а scope(exit) используется вместо finally. Однако, если вам действительно нужно исключение, вам придется его перехватить, используя блок try - catch. scope просто не дает вам доступа к исключению, поэтому вы не можете использовать оператор scope, если вы действительно хотите что-то сделать с исключением, которое было сгенерировано. Тем не менее, scope прекрасно работает, когда вам все равно, что на самом деле было исключение.

1 голос
/ 01 августа 2012

scope не заменяет catch. Вы должны использовать catch, когда действительно обрабатываете (или восстанавливаете) исключение. Если вы хотите выполнить очистку во время разматывания стека, используйте scope или иногда finally. Таким образом, вы получите намного более чистый и понятный код.

...