Имеем мы некуо сложную операцию ("сложность" в том, что из главной функции вызывается несколько вспомагательных, из них — ещё несколько вспомагательных — развесистая такая операция), которая выполняется асинхронно и может быть отменена пользователем.
В дотнете есть целый Cancellation Framework на эту тему. Он предоставляет два способа обработки события отмены операции — вызов ThrowIfCancellationRequested и самостоятельная проверка IsCancellationRequested. Соответственно, обрабатывать событие отмены можно либо так:
try {
ChildOperation(<…>, token);
} catch (OperationCancelledException) {
<…>
}//try
либо этак:
ChildOperation(<…>);
if(token.ThrowIfCancellationRequested) {
<…>;
}//if
Естественно, с исключениями код писать гораздо проще (не нужно писать различные проверки). Но вот не является ли использование исключений в данном случае следствием не действительно исключительной ситуации (мы же предусматриваем в программе отмену, то есть это вполне рабочий сценарий, которые мы технически можем обработать без исключений), а не частью програмной лигики, то есть не получается ли что мы "строим логику выполнения программы на исключениях"?
Интересно, что на эту же тему (отмена операций) есть в других платформах? Неужели что-то новое (по сравнению с тем, что сделали в Cancellation Framework)?