소켓 통신 초기화 하는 코드가 있다고 생각해보자.
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가 거리상 멀어서 좀 마음에 안듬.
그래도 위와 같은 코드 방식이 좋으려나?
아 내가 계속 생각중인데, 로깅이랑 assertion은 명백히 다른건데 같이 쓰려고 하다보니까 헷갈리는건가
assert는 보통 assert가 false가 나오는 일 자체가 논리적으로 불가능 할 때 쓰는거고, 저렇게 예외 처리 해야되는 곳에서는 별로
맞네 딱 와닿았다. 감사감사
예를 들어 유저한테 값을 받아오는데 숫자만 받기를 원한다고 어썰트를 쓸건 아니잖아? 지금 딱 그렇게 쓰고있음 - dc App
abort 계열이 다 그렇지만 정상적인 방법으로 에러를 핸들링할 수 있을때는 안쓰는게 좋아. 최대한 오류 코드를 사용하도록 지향하고 코어 덤프를 남겨야하거나, 정말로 무언가가 잘못되었거나, 이 상태로 더 진행하면 위험하다던지 그런 상황에서 쓸 법함. 그게 아니면 exit(-1);