Das Arbeiten mit Ausnahmen erleichtert die Arbeit teilweise schon sehr. Ich würde deshalb bei PDO::ERRMODE_EXCEPTION bleiben.
Wenn du etwa den von dir genannten Fehler abfangen willst, verwende einfach einen Try-Catch-Block:
<?php
[...]
try {
//Deine Queries
} catch(PDOException $e) {
if($e->getCode() == 23000) {
//Duplicate entry
}
}
[...]
?>
Mit set_exception_handler() kannst du eine globale Methode festlegen, die die Ausnahmen auffängt, die nicht durch ein catch gefangen werden.
Noch etwas: Wenn du schon PDO verwendest, kannst du auch gleich Prepared Statements verwenden. Schau dir dazu die Klasse PDOStatement, die Methode PDO::prepare(), etc. [1] an. Da sparst du dir dann auch Funktionen wie mysql_real_escape_string() bzw. PDO::quote().
[1] http://at2.php.net/manual/de/ref.pdo.php