Two different kinds of partial programs seem to be the most commonly discussed:
There are some functions that could fit in either category, depending on implementation.
For example, an implementation of division that doesn't check for zero in the denominator could run forever adding zero to the denominator.
For partial functions in the first category, we can easily convert them into total functions by making the return value capture the partial result. For division we can return either a quotient result or a division by zero marker. The person doing the division must check whether it was successful before continuing too far.
Partial functions that may never return, however, are a different beast. Proving that they are total is impossible to do in general in the presence of general recursion so one must restrict recursion in some way to prevent these.
Total functional programming is probably unpopular because dealing with every possible partial function explicitly is a nuisance and not being able to recurse freely can cause some code contortions to make things fit a limited recursion capability.