You would put an assert inside of the divide function like so:
int divide (int x, int y)
{
defend (y != 0);
return x / y;
}
Now divide is guaranteed to produce a correct result if it's called with correct data. It's up to the caller to make sure the data is correct, or an assert will happen.
Just to finish out the example to show how much cleaner asserting is compared to error handling:
int foo(void)
{
volatile int x = 4, y = 28;
return divide(x, y) + divide(y, x);
}
int main ()
{
return foo();
}
That's not to say that error handling doesn't have its place, but it should only be used for data that you can't anticipate.