Custom Exceptions based off the Visual Studio snippet
Using strongly typed data avoids this situation.


One easy and simple way to fix this argument confusion would be passing the user defined datatype instead of string which is reserved for message.

In TenantException sample, if you have Object model for Tenant, pass that object and let the constructor does the remaining with that.

[Serializable]
public class TenantNotFoundException : Exception
{
    public TenantNotFoundException() 
    { }

    public TenantNotFoundException(string message)
        : base(message)
    { }

    public TenantNotFoundException(string message, Tenant tenant)
        : base(string.Format("Tenant '{0}' not found. {1}", tenant.Name, message))
    { }
}