소켓 통신 초기화 하는 코드가 있다고 생각해보자.


SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
assert(listenSocket != INVALID_SOCKET && "Can not create listen socket");


난 위 코드처럼 실패를 바로 체크할 수 있도록 또 그리고 가독성이 괜찮도록 함수 호출 뒤에 assert를 바로 쓰거든.

그런데, 이런 종류의 함수 호출은 실패할 경우 실패한 이유를 알려준단 말이지.

errno 같은것처럼.


SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
assert(listenSocket != INVALID_SOCKET && "Can not create listen socket");
int error = WSAGetLastError();
// 로깅 어쩌구 저쩌꾸


그래서 에러코드를 아래와 같이 다시 한 번 확인 함.

SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
assert(listenSocket != INVALID_SOCKET && "Can not create listen socket");
if(listenSocket == INVALID_SOCKET)
{
    int error = WSAGetLastError();
    // 로깅...
}


이렇게 하면 일반적으로 좋았는데, 딱 하나 문제되는 지점이

디버그 모드에서 에러 확인이 잘 안됨. 왜냐면, assert에 막혀서 아래 코드로 흐르지 않거든.

그래서 하려면 릴리즈 모드로 변환해서 확인하거나 기존 코드를 수정해야하지.


그래서 이렇게 코드를 바꿔봤음

SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, 0);
if(listenSocket == INVALID_SOCKET)
{
    int error = WSAGetLastError();
    // 로깅...
}

assert(listenSocket != INVALID_SOCKET && "Can not create listen socket");


이것도 가독성이 나쁜건 아닌데, 처음 것에 비하며 내가 확인하고 싶은거랑 assert가 거리상 멀어서 좀 마음에 안듬.

그래도 위와 같은 코드 방식이 좋으려나?