둘 다 사용해야합니다. Assert는 개발자의 편의를위한 것입니다. 예외는 런타임 중에 놓쳤거나 예상하지 못한 것을 포착합니다.
나는 평범한 오래된 주장 대신 glib의 오류보고 기능을 좋아했습니다 . 그들은 assert 문처럼 동작하지만 프로그램을 중지하는 대신 값을 반환하고 프로그램을 계속합니다. 놀랍게도 잘 작동하며, 함수가 "무엇을해야하는지"를 반환하지 않을 때 프로그램의 나머지 부분에 어떤 일이 발생하는지 확인할 수 있습니다. 충돌이 발생하면 오류 검사가 다른 곳에서 느슨하다는 것을 알고 있습니다.
마지막 프로젝트에서 이러한 스타일의 함수를 사용하여 전제 조건 검사를 구현했으며 그중 하나가 실패하면 스택 추적을 로그 파일에 인쇄하지만 계속 실행했습니다. 디버그 빌드를 실행할 때 다른 사람들이 문제를 겪을 때 많은 디버깅 시간을 절약했습니다.
#ifdef DEBUG
#define RETURN_IF_FAIL(expr) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return; \
}; } while(0)
#define RETURN_VAL_IF_FAIL(expr, val) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return val; \
}; } while(0)
#else
#define RETURN_IF_FAIL(expr)
#define RETURN_VAL_IF_FAIL(expr, val)
#endif
인수의 런타임 검사가 필요한 경우 다음을 수행합니다.
char *doSomething(char *ptr)
{
RETURN_VAL_IF_FAIL(ptr != NULL, NULL); // same as assert(ptr != NULL), but returns NULL if it fails.
// Goes away when debug off.
if( ptr != NULL )
{
...
}
return ptr;
}