Как в таких случаях грамотней делать?
А проблема-то в чем? Выносите в функцию, функция возвращает true если снятие точно прошло успешно. В нее же все проверки... И если возвращено true - сообщать что снято.
Для решения похожих проблем используется подход Аспектно-Ориентированного Программирования (АОП). Почитать можноЗдесь (вики)Здесь (хабр)Здесь (почти книжка)
Поддержка обеспечивается с помощью фреймворков типа AspectJ, Aspect#, Aspect.NET и кучей других.