Looking at the code of the game, it seems that you will only receive the "[Race] hate you for no reason" message for single trade missions, while you will receive the "Your kittens return empty-pawed" message if you send multiple trade missions at once and they all fail, e.g. from hostile relations, or failed trade chances from Dragons or Leviathans.
On a more technical level...
Four functions are of particular significance here:
trade is called for single trade missions,
tradeMultiple is called for multiple trade missions. Both functions call
tradeInternal to determine the results of each individual trade mission.
tradeInternal will normally print out the hostile/friendly messages, but it can be passed a boolean value to specify that these messages should be suppressed, which
tradeInternal will return a null value if you get the "[Race] hate you" result, otherwise it will return the details of what you got. Even if the trade fails for reasons other than hostile relations,
tradeInternal will still return an empty set.
trade will pass the results from
tradeInternal directly into
tradeMultiple will gather the results into a set before passing them. Herein lies the determining factor for whether the "Your kittens return empty-pawed" message will be shown. If
printYieldOutput receives a null value, it will effectively do nothing. However, if it receives an empty set, it will instead print the message in question.
Source: Kittens Game BitBucket repository, lines 418 to 588 as of posting