Which is more efficient: contradict a unique constraint or check if row exists? If I'm regularly going to to attempt to add a duplicate row in a table and duplicates aren't allowed, should I attempt the insert and catch an exception or manually check for the row's existence and only try the insert if the row isn't found?

In both cases, the unique constraint exists.
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.