The first option is more accurate in case you need to propagate the error to higher layers, however I do not recommend that you create a new Exception object.
The drawback of the second option is that you can only return a message when your method returns a string.
What you should do is:
If you know in advance that under certain conditions, an operation can fail, it is better that you throw the exception:
if(empleado == null || empleado.nombre == null) throw new InvalidOperationException("Mensaje relacionado a objetos de empleados no inicializados");
if(empleado.id < 0) throw new InvalidOperationException(string.Format("Mensake de Id no válido: {0}", empleado.nombre));
which will allow you to have a try / catch that will only propagate the errors:
try{ }catch{ throw; }
Which is basically the same as:
try{ }catch(Exception exc) { throw exc; }
What you should not do is:
try{ }catch(Exception exc) { throw new Exception("Mensaje"); }
Since you would be overwriting valuable information about the cause of the exception and sending only a message that will surely be something like: "failed to load users" without really having information about the type of exception or a clear message of the cause of the error .