python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性 。
例如,我们定义一个函数
first = input('请输入除数:')second = input('请输入被除数:')first = int(first)second = int(second)res = first/secondli = [1,2,3,4]print(li[5])
如果除数second=0,那代码就会抛异常,ZeroDivisionError: division by zero,除数是不能为0的。
如果除数输入是字符串,那么代码也会抛异常,TypeError: unsupported operand type(s) for /: 'int' and 'str'
这时就需要捕捉异常了,当除数为0时提示用户所传参数不对。异常处理使用的是try .... except.....关键字。
first = input('请输入除数:')second = input('请输入被除数:')try: first = int(first) second = int(second) res = first/secondexcept ValueError as e: #这个e代表错误信息,如果上面的两行代码出现了 ValueError这个错 print(e) print('请输入整数')except ZeroDivisionError as e: print(e) print('除数不能为0')
当异常种类很多的时候,我们可以统一写为except Exception as e:
first = input('请输入除数:')second = input('请输入被除数:')try: first = int(first) second = int(second) res = first/secondexcept Exception as e: #上面代码出异常的时候走这里, print(e) print('出错了。。。。。')
else: #没有出错,也不是必须写的 print('并没有出错')#这个是没有异常的时候走 print(res) finally:#不管出错或者没有出错都会执行它,也不是必须写的。 print('我是finally')
现在我们完善一下操作数据库的函数
1.数据库在连接不成功时会抛异常
2.在执行sql的时候,如果sql语句写的不正确也会抛异常
def my_db2(sql): try: coon = pymysql.connect( **MYSQL_INFO ) except Exception as res: print('数据库连接失败了') return '数据库连接失败了' cur = coon.cursor() # 建立游标 try: cur.execute(sql)#执行sql except Exception as res: print('sql出错,sql是%s'%sql) return 'sql出错' else: if sql.strip()[:6].upper()=='SELECT': res = cur.fetchall() else: coon.commit() res = 'ok' finally: cur.close() coon.close() return res