Skip to content

Files

Latest commit

8244caa · Jun 26, 2020

History

History
134 lines (86 loc) · 3.33 KB

62.md

File metadata and controls

134 lines (86 loc) · 3.33 KB

处理错误

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


于 2020 年 1 月 7 日更新


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

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

from __future__ import print_function

import MySQLdb as my

try:

    db = my.connect(host="127.0.0.1",
                    user="root",
                    passwd="",
                    db="world"
                  )

    cursor = db.cursor()

    sql = "select * from city"
    number_of_rows = cursor.execute(sql)
    print(number_of_rows)
    db.close()

except my.Error as e:
    print(e)

except :
    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 语法错误,指定的参数数量错误等。

from __future__ import print_function

import MySQLdb as my

try:

    db = my.connect(host="127.0.0.1",
                    user="root",
                    passwd="",
                    db="world"
                   )

    cursor = db.cursor()

    sql = "select * from city"
    number_of_rows = cursor.execute(sql)
    print(number_of_rows)
    db.close()

except my.DataError as e:
    print("DataError")
    print(e)

except my.InternalError as e:
    print("InternalError")
    print(e)

except my.IntegrityError as e:
    print("IntegrityError")
    print(e)

except my.OperationalError as e:
    print("OperationalError")
    print(e)

except my.NotSupportedError as e:
    print("NotSupportedError")
    print(e)

except my.ProgrammingError as e:
    print("ProgrammingError")
    print(e)

except :
    print("Unknown error occurred")

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