Il sistema con le eccezioni mi pare proprio brutto. L'altro è meglio, difficile stabilire se sia il migliore.
Io lo avrei scritto così
codice:
# assunto che un prezzo nullo abbia senso rappresentarlo con la stringa "0.00"
def price
  "%.2f" % (read_attribute(:price) or 0)
end
ma è più che altro questione di gusti.