You need the unique index (or constraint, I prefer indexes because of includes and filters) anyway to guarantee data integrity.
So the question is one of
- do check-as-part-of-insert? OR
- try insert-and-catch?
Note, checking before insert is not reliable, for at least these reasons
- if someone does it manually
- assumes you have a consistent code path to insert
- 2 concurrent IF checks can potentially both see that the row does not exist and try to insert the same value
Using INSERT...WHERE NOT EXISTS (As mentioned in comments) will use the index, so will be efficient anyway.
There is no benefit in dealing with exceptions unless you have a real need to.