处理错误

原文: https://thepythonguru.com/handling-errors/


于 2020 年 1 月 7 日更新


与数据库交互是一个容易出错的过程,因此我们必须始终实现某种机制来优雅地处理错误。

MySQLdb 具有MySQLdb.Error异常,这是一个顶级异常,可用于捕获MySQLdb模块引发的所有数据库异常。

  1. from __future__ import print_function
  2. import MySQLdb as my
  3. try:
  4. db = my.connect(host="127.0.0.1",
  5. user="root",
  6. passwd="",
  7. db="world"
  8. )
  9. cursor = db.cursor()
  10. sql = "select * from city"
  11. number_of_rows = cursor.execute(sql)
  12. print(number_of_rows)
  13. db.close()
  14. except my.Error as e:
  15. print(e)
  16. except :
  17. print("Unknown error occurred")

MySQLdb 中的两个主要错误


需要注意的是,MySQLdb 中有两类异常类:

  1. DatabaseError
  2. InterfaceError

  1. DatabaseError:当数据处理中存在问题,sql 语法错误,mysql 内部问题时,引发此异常。 如果建立连接并且出现问题,则DatabaseError会捕获到它。

  2. InterfaceError:当由于某种原因数据库连接失败时,MySQLdb 将引发InterfaceError。 注意InterfaceError仅在与数据库连接存在内部问题时才引发,MySQLdb 不会因错误的数据库名称或密码而引发InterfaceError

DatabaseError进一步分为 6 种类型:

  1. DataError
  2. InternalError
  3. IntegrityError
  4. OperationalError
  5. NotSupportedError
  6. ProgrammingError

  1. DataError:当数据处理出现问题时,例如除以零,范围的数值,MySQLdb 会引发此错误。

  2. InternalError:当 MySQL 数据库本身存在一些内部错误时,引发此异常。 例如无效的游标,事务不同步等。

  3. IntegrityError:当外键检查失败时,引发此异常。

  4. OperationalError:对于不受程序员控制的事情,会引发此异常。 例如,意外断开连接,内存分配错误等,所选数据库不存在。

  5. NotSupportedError:当存在不支持的方法或 api 时,引发此异常。

  6. ProgrammingError:引发此编程错误。 例如找不到表,mysql 语法错误,指定的参数数量错误等。

  1. from __future__ import print_function
  2. import MySQLdb as my
  3. try:
  4. db = my.connect(host="127.0.0.1",
  5. user="root",
  6. passwd="",
  7. db="world"
  8. )
  9. cursor = db.cursor()
  10. sql = "select * from city"
  11. number_of_rows = cursor.execute(sql)
  12. print(number_of_rows)
  13. db.close()
  14. except my.DataError as e:
  15. print("DataError")
  16. print(e)
  17. except my.InternalError as e:
  18. print("InternalError")
  19. print(e)
  20. except my.IntegrityError as e:
  21. print("IntegrityError")
  22. print(e)
  23. except my.OperationalError as e:
  24. print("OperationalError")
  25. print(e)
  26. except my.NotSupportedError as e:
  27. print("NotSupportedError")
  28. print(e)
  29. except my.ProgrammingError as e:
  30. print("ProgrammingError")
  31. print(e)
  32. except :
  33. print("Unknown error occurred")

在下一篇文章中,我们讨论如何从数据库中获取特定的行数。