Finite state machines make exception processing easier. They also inspire horror in those used to if() then ... else() trees, but them's the breaks. SFAIK, FSM are the difference between high reliability and ... not so reliable systems.
That's one way to do hi-rel processing in 'C'.... it all makes choice of language less of an issue. And if you have adequate logging of test site installs ( meaning all state transition data is logged ), then you can reproduce 100% of failures in a controlled environment.
It's not magic, but somehow, making the error cases explicit events has ( on me at least ) the effect of being able to reason about them more effectively. It's just another event.