Index: test/reflection.py
===================================================================
--- test/reflection.py	(revision 1575)
+++ test/reflection.py	(working copy)
@@ -3,6 +3,7 @@
 import sqlalchemy.databases.postgres as postgres
 
 from sqlalchemy import *
+from sqlalchemy.exceptions import *
 
 from testbase import PersistTest
 import testbase
@@ -141,6 +142,11 @@
         assert not table2.c.name.nullable 
         assert table2.c.description.nullable 
         
+    def test_inexistent(self):
+        self.assertRaises(NoSuchTableError, Table,
+                          'really_it_doesnt_exist_this_tbl',
+                          testbase.db, autoload=True)
+        
     def testoverride(self):
         table = Table(
             'override_test', testbase.db, 
Index: lib/sqlalchemy/databases/mssql.py
===================================================================
--- lib/sqlalchemy/databases/mssql.py	(revision 1575)
+++ lib/sqlalchemy/databases/mssql.py	(working copy)
@@ -345,11 +345,12 @@
                    order_by=[columns.c.ordinal_position])
         
         c = connection.execute(s)
+        found_table = False
         while True:
             row = c.fetchone()
             if row is None:
                 break
-
+            found_table = True
             (name, type, nullable, charlen, numericprec, numericscale, default) = (
                 row[columns.c.column_name], 
                 row[columns.c.data_type], 
@@ -371,8 +372,10 @@
                 colargs.append(PassiveDefault(sql.text(default)))
                 
             table.append_item(schema.Column(name, coltype, nullable=nullable, *colargs))
-
-
+        
+        if not found_table:
+            raise exceptions.NoSuchTableError(table.name)
+        
         # We also run an sp_columns to check for identity columns:
         # FIXME: note that this only fetches the existence of an identity column, not it's properties like (seed, increment)
         #        also, add a check to make sure we specify the schema name of the table
Index: lib/sqlalchemy/databases/sqlite.py
===================================================================
--- lib/sqlalchemy/databases/sqlite.py	(revision 1575)
+++ lib/sqlalchemy/databases/sqlite.py	(working copy)
@@ -158,11 +158,13 @@
 
     def reflecttable(self, connection, table):
         c = connection.execute("PRAGMA table_info(" + table.name + ")", {})
+        found_table = False
         while True:
             row = c.fetchone()
             if row is None:
                 break
             #print "row! " + repr(row)
+            found_table = True
             (name, type, nullable, primary_key) = (row[1], row[2].upper(), not row[3], row[5])
             
             match = re.match(r'(\w+)(\(.*?\))?', type)
@@ -176,6 +178,10 @@
                 #print "args! " +repr(args)
                 coltype = coltype(*[int(a) for a in args])
             table.append_item(schema.Column(name, coltype, primary_key = primary_key, nullable = nullable))
+        
+        if not found_table:
+            raise exceptions.NoSuchTableError(table.name)
+        
         c = connection.execute("PRAGMA foreign_key_list(" + table.name + ")", {})
         while True:
             row = c.fetchone()
Index: lib/sqlalchemy/databases/information_schema.py
===================================================================
--- lib/sqlalchemy/databases/information_schema.py	(revision 1575)
+++ lib/sqlalchemy/databases/information_schema.py	(working copy)
@@ -3,7 +3,7 @@
 import sqlalchemy.schema as schema
 import sqlalchemy.ansisql as ansisql
 import sqlalchemy.types as sqltypes
-from sqlalchemy.exceptions import *
+import sqlalchemy.exceptions as exceptions
 from sqlalchemy import *
 from sqlalchemy.ansisql import *
 
@@ -119,12 +119,14 @@
         order_by=[columns.c.ordinal_position])
         
     c = connection.execute(s)
+    found_table = False
     while True:
         row = c.fetchone()
         if row is None:
             break
         #print "row! " + repr(row)
  #       continue
+        found_table = True
         (name, type, nullable, charlen, numericprec, numericscale, default) = (
             row[columns.c.column_name], 
             row[columns.c.data_type], 
@@ -146,6 +148,9 @@
         if default is not None:
             colargs.append(PassiveDefault(sql.text(default)))
         table.append_item(schema.Column(name, coltype, nullable=nullable, *colargs))
+    
+    if not found_table:
+        raise exceptions.NoSuchTableError(table.name)
 
     s = select([constraints.c.constraint_name, constraints.c.constraint_type, constraints.c.table_name, key_constraints], use_labels=True, from_obj=[constraints.join(column_constraints, column_constraints.c.constraint_name==constraints.c.constraint_name).join(key_constraints, key_constraints.c.constraint_name==column_constraints.c.constraint_name)])
     if not use_mysql:
Index: lib/sqlalchemy/databases/mysql.py
===================================================================
--- lib/sqlalchemy/databases/mysql.py	(revision 1575)
+++ lib/sqlalchemy/databases/mysql.py	(working copy)
@@ -186,11 +186,13 @@
         table.kwargs['mysql_engine'] = tabletype
         
         c = connection.execute("describe " + table.name, {})
+        found_table = False
         while True:
             row = c.fetchone()
             if row is None:
                 break
             #print "row! " + repr(row)
+            found_table = True
             (name, type, nullable, primary_key, default) = (row[0], row[1], row[2] == 'YES', row[3] == 'PRI', row[4])
             
             match = re.match(r'(\w+)(\(.*?\))?', type)
@@ -214,6 +216,8 @@
                                                    nullable=nullable,
                                                    default=default
                                                    )))
+        if not found_table:
+            raise exceptions.NoSuchTableError(table.name)
     
     def moretableinfo(self, connection, table):
         """Return (tabletype, {colname:foreignkey,...})
@@ -286,4 +290,4 @@
         self.append("\nDROP INDEX " + index.name + " ON " + index.table.name)
         self.execute()
 
-dialect = MySQLDialect
\ No newline at end of file
+dialect = MySQLDialect
Index: lib/sqlalchemy/databases/oracle.py
===================================================================
--- lib/sqlalchemy/databases/oracle.py	(revision 1575)
+++ lib/sqlalchemy/databases/oracle.py	(working copy)
@@ -168,10 +168,12 @@
     def reflecttable(self, connection, table):
         c = connection.execute ("select COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT from ALL_TAB_COLUMNS where TABLE_NAME = :table_name", {'table_name':table.name.upper()})
         
+        found_table = False
         while True:
             row = c.fetchone()
             if row is None:
                 break
+            found_table = True
 
             #print "ROW:" , row
             (name, coltype, length, precision, scale, nullable, default) = (row[0], row[1], row[2], row[3], row[4], row[5]=='Y', row[6])
@@ -201,7 +203,9 @@
             
             table.append_item (schema.Column(name, coltype, nullable=nullable, *colargs))
 
-   
+        if not found_table:
+            raise exceptions.NoSuchTableError(table.name)
+        
         c = connection.execute(constraintSQL, {'table_name' : table.name.upper()})
         while True:
             row = c.fetchone()
Index: lib/sqlalchemy/databases/firebird.py
===================================================================
--- lib/sqlalchemy/databases/firebird.py	(revision 1575)
+++ lib/sqlalchemy/databases/firebird.py	(working copy)
@@ -195,9 +195,11 @@
         #import pdb;pdb.set_trace()
         # get all of the fields for this table
         c = connection.execute(tblqry, [table.name.upper()])
+        found_table = False
         while True:
             row = c.fetchone()
             if not row: break
+            found_table = True
             args = [row['FNAME']]
             kw = {}
             # get the data types and lengths
@@ -208,6 +210,9 @@
             # is it a primary key?
             table.append_item(schema.Column(*args, **kw))
             # does the field have indexes
+        
+        if not found_table:
+            raise exceptions.NoSuchTableError(table.name)
 
     def last_inserted_ids(self):
         return self.context.last_inserted_ids
Index: lib/sqlalchemy/exceptions.py
===================================================================
--- lib/sqlalchemy/exceptions.py	(revision 1575)
+++ lib/sqlalchemy/exceptions.py	(working copy)
@@ -34,6 +34,11 @@
     This error generally corresponds to runtime state errors."""
     pass
 
+class NoSuchTableError(InvalidRequestError):
+    """sqlalchemy was asked to load a table's definition from the database,
+    but the table doesn't exist."""
+    pass
+
 class AssertionError(SQLAlchemyError):
     """corresponds to internal state being detected in an invalid state"""
     pass
