Теоретически, вызывающий код должен всегда обеспечивать выполнение предварительных условий перед вызовом функции. То же самое касается конструкторов.
На практике программисты ленивы, и, конечно, лучше проверять предварительные условия. Утверждения там пригодятся.
Пример. Извините, мой синтаксис в фигурных скобках:
// precondition b<>0
function divide(a,b:double):double;
begin
assert(b<>0); // in case of a programming error.
result := a / b;
end;
// calling code should be:
if foo<>0 then
bar := divide(1,0)
else
// do whatever you need to do when foo equals 0
Кроме того, вы всегда можете изменить предварительные условия. В случае конструктора это не очень удобно.
// no preconditions.. still need to check the result
function divide(a,b:double; out hasResult:boolean):double;
begin
hasResult := b<>0;
if not hasResult then
Exit;
result := a / b;
end;
// calling code:
bar := divide(1,0,result);
if not result then
// do whatever you need to do when the division failed