Альтернатива уловить в D?

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

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

Ответ 1

Операторы

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

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

Ответ 2

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