You should use FaultException<TDetail>
and put your specific information in the serializable TDetail
type.
Your service contract should have a fault contract specifying the TDetail
type.
This technique enables you to communicate error information in an interoperable way, including to clients that know nothing about .NET exceptions.
If for some reason you don't want to use fault contracts, you could consider using the non-generic FaultException, and communicate additional information about the error in the fault reason and/or fault code / subcode.