(Te sobran los paréntesis más externos.)
Si no se ha podido conectar, $DBI::errstr y $DBI::err tendrán almacenados el mensaje y número de error que ha ocurrido.
Como tienes puesta la opción
PrintError => 0, el mensaje no saldrá al STDERR, así que no sabrás qué ha ocurrido. Por eso tienes que analizarlo desde el propio programa (no queremos que el usuario vea el error original en inglés, y/o que el programa lo gestione por sí mismo).
Pero el problema lo tienes en
RaiseError => 1, ya que con eso estás indicando que si ocurre un error, se muera el programa (y mostrando el error en STDERR).
Si no quieres que el usuario vea ningún error, deberás ponerlo a '0'.
Y... ¿cuál es el mensaje de error? Depende del motor de bases de datos que estemos usando. Si es MySQL, saldrá algo como esto:
Using text Syntax Highlighting
root@hs-981:~/# perl -MDBI -E 'DBI->connect("DBI:mysql:database=kkk", "user", "pass", {PrintError => 0, RaiseError => 0}); say "[$DBI::err][$DBI::errstr]"'
[1045][Acceso negado para usuario: 'user'@'localhost' (Usando clave: SI)]
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
También saldrá el mismo mensaje de error si la tabla es correcta pero si el usuario (o la contraseña) están mal.
Si, en cambio, los usuarios son correctos y tienen permisos para conectarse, pero la tabla es incorrecta, saldrá este mensaje:
Using text Syntax Highlighting
[1049][Base de datos desconocida 'kkk']
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
con lo que puedes usarlo para sacar un aviso en pantalla e informar al usuario.
Lista de códigos de error para MySQL (para el servidor).
Using perl Syntax Highlighting
if ($DBI::err == 1049) {
say "La base de datos no está bien indicada o no existe";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4