2013-03-08 4 views
2

testons actuellement le code suivant:Impossible d'attraper mysql2 :: erreur dans Rails

def db_check 
    begin 
    schema_call = ActiveRecord::Base.establish_connection(
     :adapter => 'mysql2', 
     :host => 'localhost', 
     :database => 'dev_db', 
     :username => 'dev_user', 
     :password => 'dev_pw').connection.execute("SELECT * FROM schema_migrations LIMIT 1") 

    if schema_call 
     render :status => 200, :file => "public/success.html" 
    else 
     render :status => 500, :file => "public/query_fail.html" 
    end 
    rescue Exception => e 
    puts "#{e.class} ;; #{e.message}" 
    logger.debug "#{e.class}" 
    render :status => 500, :file => "public/500.html" 
    end 
end 

L'objectif final est d'avoir un appel à un serveur MySQL pour voir si 1) le serveur est toujours et 2) si la base de données est disponible Si la connexion ne fonctionne pas, une erreur est lancée, donc je mets le code dans un bloc rescue. Malheureusement, même lorsque j'utilise rescue Exception, ce que je comprends pour être déconseillé, je reçois toujours un message Mysql2 :: Error dans le navigateur (j'ai également essayé de sauvetage Mysql2:Error, qui n'a eu aucun effet).

La duplication de la journalisation des erreurs dans le rescue est une tentative supplémentaire d'obtenir des informations supplémentaires, mais rien n'a fonctionné jusqu'à présent. Quelqu'un sait comment attraper cette erreur?

MISE À JOUR: aussi, pour le contexte, d'essai le code avec MySQL ne fonctionne pas actuellement (état si le serveur DB est en panne), retournez les éléments suivants:

Mysql2::Error 
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ce qui est logique partielle, étant donné le serveur est éteint, mais je ne comprends toujours pas pourquoi il ne sauve pas l'erreur.

Répondre

2

La raison pour laquelle le rescue n'est pas attrapant le mysql2 :: Erreur est que l'erreur ne vient pas de la ActiveRecord :: Base Code, mais plutôt Rails envoyer une erreur, car il ne peut pas se connecter au serveur MySQL qu'il attend (que j'avais éteint pour tester le code ci-dessus).

+3

Alors, y a-t-il un moyen d'attraper de telles erreurs? – cyrilchampier

+0

Sérieusement - il doit y avoir un moyen de sauver cela. –

+0

@TJ Biddle: L'exemple 'begin rescue' de IanL fonctionne pour capturer ma' MySQL2 :: Error ... la contrainte de clé étrangère échoue'. Je vérifie qu'une contrainte de clé étrangère existe du côté de la base de données en utilisant rspec qui fonctionne maintenant. Merci Ian. – Chris

Questions connexes