These days, I’m more and more defining robust commands, e.g., using \newrobustcmd (etoolbox package) or \NewDocumentCommand (xparse package). Robust commands seem advantageous to me in many respects and, in fact, other people do think the same. To quote from the section of the xparse package documentation dedicated to the tools supporting the definition of non-robust (i.e. fully expandable) commands:
There are very rare occasion[s] when it may be useful to create functions using a fully-expandable argument grabber. To support this,
xparsecan create expandable functions as well as the usual robust ones. […] This facility should only be used when absolutely necessary; if you do not understand when this might be, do not use these functions!
Yet I’ve made the experience that robust commands have their pitfalls. Consider, for instance, the following minimal example:
\documentclass{article}
\usepackage{etoolbox}
\newrobustcmd*{\test}[1]{%
\ifblank{#1}{blank}{not blank}%
}
\begin{document}
\tableofcontents
\section{\test{\empty}}
\end{document}
The output is rather unsatisfying since the decision of \test on the nature of its argument is context-dependent:

What shall I do in this and similar situations? Resort to \newcommand?

\section, which would be much better to write its argument\unexpanded. – Joseph Wright Jun 30 '12 at 16:35