It is not very common, but sometimes, $Failed is used as a head, like
f[x___]:= $Failed[x]
This makes it possible to have "return code" returned, rather than just a fact of failure.
Basically, when this is used, it is usually in the error-reporting fall-back rule. In some cases, one may want to not evaluate the arguments x (e.g. if f is Hold*). I don't use $Failed in such fashion myself, but I've seen such code, and I don't find any particular reason not to use it in this way. Of course, one could also use $Failed[Hold[x]], but arguably this is a clumsier method.
$Failedis used as a head, likef[x___]:= $Failed[x]. This makes it possible to have "return code" returned, rather than just a fact of failure. Basically, when this is used, it is usually in the error-reporting fall-back rule. In some cases, one may want to not evaluate the argumentsx(e.g. iffisHold*). I don't use$Failedin such fashion myself, but I've seen such code, and I don't find any particular reason not to use it in this way. Of course, one could also use$Failed[Hold[x]], but arguably this is a clumsier method. $\endgroup$