Com
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
fetch sempre lançará uma exceção se houver um erro. Você pode lidar com aqueles em seu bloco catch e não importa o que ele retornou. Portanto, se você não capturou uma exceção e ela retornou false, você pode assumir com segurança que foi devido a um conjunto vazio. Esta é uma maneira muito eficaz de lidar com erros de PDO. Para responder à sua pergunta, existem muitas maneiras de simular um erro. O mais básico é a sintaxe de consulta imprópria. Você também pode tentar vincular um parâmetro que não está lá, vincular o número errado de parâmetros etc. Quanto mais tempo você usar esse esquema, mais tipos de erros/exceções você verá. É muito eficaz, pois cada erro inclui uma mensagem detalhada para ajudá-lo a depurá-lo.