Me pregunto si de verdad lees parte del manual, no sólo el código, también los detalles de implementación y valores de retorno, etc.
Cita: Es importante recordar que el gestor de errores estándar de PHP es completamente evitado por los tipos de errores especificados por error_types a menos que la función de llamada de retorno devuelva FALSE. La configuración de error_reporting() no tendrá efecto y su gestor de errores será llamado de todas formas - aunque aún es capaz de leer el valor actual de error_reporting y actuar de manera apropiada. En particular, observe que este valor será 0 si a la sentencia que causó el error se le añadió al principio el operador de control de errores @ .
Revisa tu implementación, está claro que no sigues las recomendaciones del manual.
PDTA: Acabo de probar tu segundo ejemplo y me funciona perfectamente, ¿será que no tienes configurada correctamente tu instalación de PHP?