Я никогда не видел решения для коммутатора, но я делал такие вещи:
do {
err = func();
if( err ) break;
err = func2();
if( err ) break;
...
} while( 0 );
if( err ) {
// handle errors
}
Но в чем реальная разница между этим и этим:
err = func();
if( err ) goto done;
err = func2();
if( err ) goto done;
...
done:
if( err ) {
//handle errors;
}
Первый - просто второй, переписанный, чтобы избежать использования ключевого слова goto
, и я бы сказал, что решение goto
более читабельно. Это заняло у меня некоторое время, но мне удалось убедить себя, что goto
не всегда всегда зло.
В конце концов, я предпочитаю просто использовать операторы if
, если это возможно, поскольку это делает код более читабельным, но goto
s при необходимости.