2009-11-11 11 views
1

Salutations,lever MysqlError; soulève Mysql :: Erreur les deux fonctionnent, comment est-ce arrivé?

Je travaillais sur les exceptions mysql et je suis tombé sur ce problème intéressant, dans lequel une exception levée répond à deux noms d'exception différents. Comment est-ce arrivé?

-Daniel

#!/usr/bin/env ruby 

require 'rubygems' 
require 'mysql' 
require 'yaml' 
require 'pp' 

$config = YAML.load_file 'database.yml' 

class ExceptionPrinter 

    def self.print msg, e 
    puts msg 
    pp e 
    end 

end 

# sample connect: dbh = Mysql.real_connect $config['database']['host'], $config['database']['user'], $config['database']['password'], $config['database']['db'], $config['database']['port'] 

# test 1 - what class is thrown? 

begin 

    puts "Starting test - MysqlError" 
    dbh = Mysql.real_connect $config['database']['host'], $config['database']['user'], $config['database']['password'], $config['database']['db'] 
    puts "Error: Code did not throw exception" 

rescue MysqlError => e # MysqlError is not a valid exception catch 

    ExceptionPrinter.print "MysqlError", e 

rescue Exception => e 

    ExceptionPrinter.print "Exception class", e 

end 

# test 2 - What class is thrown? 

begin 

    puts "Starting test - Mysql::Error" 
    dbh = Mysql.real_connect $config['database']['host'], $config['database']['user'], $config['database']['password'], $config['database']['db'] 
    puts "Error: Code did not throw exception" 

rescue Mysql::Error => e 

    ExceptionPrinter.print "Mysql::Error", e 

rescue Exception => e 

    ExceptionPrinter.print "Exception class", e 

end 

- Sortie

Démarrage du test - MysqlError MysqlError

Starting test - Mysql :: Erreur Mysql :: Erreur

Répondre

1

On dirait que l'on est juste un alias à l'autre:

Mysql::Error 
# => Mysql::Error 
MysqlError 
# => Mysql::Error 

Sur cette base, je prévois que quelque part dans le joyau MySQL, il y a une ligne comme ceci:

class Mysql 
    MysqlError = Mysql::Error 
end 

Cela implique que MysqlError est une constante définie comme la classe Mysql :: Error.