함수내 에러처리에 대한 방법은 여러가지가 있겠으나, 최근 흥미로운 글 하나를 읽었다.

http://www.codeofhonor.com/blog/error-handling-using-forever-loop

for loop 를 활용한 기법인데 정리해보면 다음과 같다.

먼저 일반적인 함수내 에러처리 방식을 보면, 아마 다음과 같을것이다.

bool someFuncPlain ()
{
    if (작업1 수행이 실패한경우) {
        에러 발생시의 추가 작업수행...;
        return false;
    }

    if (작업2 수행이 실패한경우) {
        return false;
    }
    ....

    // 함수내 모든 처리 완료
    return true;
}

goto를 사용해서 다음처럼 처리할수도 있다.

bool someFuncGoto ()
{
    if (작업1 수행이 실패한경우) {
        goto errExit;
    }

    if (작업2 수행이 실패한경우) {
        goto errExit;
    }
    ....

    // 함수내 모든 처리 완료
    return true;

    errExit:
        에러 발생시의 추가 작업수행;
    return false;
}

나는 위 예제처럼 함수 내 에러 처리 용도로 goto 를 사용하지 않지만, 다중 루프내에서 에러가 발생하여, 모든 루프를 탈출할 필요가 있을때 종종 사용하곤 한다. goto사용이 바람직하지 않고 심지어 죄악시 여겨지기도 하지만, 이 정도는 그리 해롭지 않다고 생각하기 때문이다.

그리고 이 글의 주제인 for loop를 이용한 방법이다.

bool someFuncForLoop ()
{
    bool result = false;
    for (;;) {
        if (작업1 수행이 실패한경우) {
            result = false;
            break;
        }

        if (작업2 수행이 실패한경우) {
            result = false;
            break;
        }
        ....
        // 함수내 모든 처리 완료
        result = true;
        break;
    } //for

    if (!result) {에러 발생시의 추가 작업수행};  //cleanup
    return result;
}

이 기법을 사용하면 에러처리 코드가 함수의 원래 기능에 대한 코드의 가독성을 해치지 않고, cleanup 코드가 항상 수행되기 때문에 좀 더 정확한 함수 작성을 가능하게 해준다고 주장하고 있다.