Null / blank values on puppet facts

Facter has lots of facts that only set under certain circumstances. Before using them you should check if they are undefined.

if $::hostslocal != undef {
  do_your_thing_here
}

If you really want your custom fact to always have a value, you can do something like

Facter.add(:hostslocal) do
  setcode do
    if File.exist? "/etc/hosts.local"
      Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
    else
      "unknown"
    end
  end
end

You have the power of Ruby at your disposal when writing such custom facts. So just check if the file in question even exists before doing the exec action. Something like:

Facter.add(:hostslocal) do
  setcode do
    if File.exist? "/etc/hosts.local"
      Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
    end
  end
end

Untested of course, but that should be the direction in which you want to go. Have a look at the official documentation for further details about custom facts.