Założenia Programowanie zakłada, że elementy programu powinny odnosić się do siebie na zasadzie kontraktów, czyli: Każdy element powinien zapewniać określoną funkcjonalność i wymagać ściśle określonych środków do wykonania polecenia. Klient może użyć funkcjonalności, o ile spełni zdefiniowane wymagania. Kontrakt opisuje wymagania stawiane obu stronom. Element zapewniający funkcjonalność powinien przewidzieć sytuacje wyjątkowe, a klient powinien je rozpatrzyć. W niektórych językach wychwytywanie wyjątków ma charakter obowiązkowy (np. Java), inne pozostawiają programiście wybór.

Sprawdzenie danych wejściowych i wyjściowych Głównym mechanizmem programowania kontraktowego jest weryfikacja danych przesyłanych do funkcji i jej wyniku. Sprawdzanie danych wejściowych jest bardzo powszechną praktyką, stosowaną nawet w językach nieposiadających specjalnie przygotowanych do tego konstrukcji. Znacznie rzadsza jest kontrola zwracanej wartości.