Você poderia estar executando isso com um bloco try catch:
try {
$prep->execute($values);
// do other things if successfully inserted
} catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) {
// duplicate entry, do something else
} else {
// an error other than duplicate entry occurred
}
}
Você também pode procurar alternativas como "INSERT IGNORE" e "INSERT... ON DUPLICATE KEY UPDATE" - embora eu ache que essas são específicas do MySQL e iriam contra a portabilidade de usar o PDO, se isso é algo que você está preocupado .
Edit:Para responder mais formalmente à sua pergunta, para mim, a solução nº 1 (o programador defensivo) em uso total elimina efetivamente o ponto da restrição exclusiva em primeiro lugar. Então eu concordo com o seu pensamento de deixar o MySQL cuidar da verificação de dados.