PHPからMySQLを扱いたい時にはPDOを使う.
SQL文を実行して失敗した時、try~catchの中に入らない.なぜ.
調べてみたところ、PDOはデフォルトで例外を吐かないよう.
デフォルトのエラーモードが PDO::ERRMODE_SILENTになっているため、例外を吐くように変更.
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
もしくは
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
これで PDOExceptionを吐くのでcatchできるようになる