Assertions are excellent at catching bugs during development. However, some checks need to be performed at runtime for production code as well. A good way to wrap the two is this:
if (condition_failed){ ASSERT(false); return error_code}
At debug time, this forces the debugger to stop at the error point. In production, the program has a chance to recover since it doesn’t accept an invalid value blindly.