1、异常是什么
问题和错误、网络错误、系统错误
还有不可预料的情况,比如文件不存在、空间满了、通讯超时等等
Python的常见异常
ZeroDivisionError:比如0做除数
NameError:比如变量还没有定义的时候使用变量
TypeError:比如字符串连接整数
1.1 Python的捕获和异常处理语法
try:
程序执行语句块
except Exception as 别名:
异常处理语句块
(except可以出现多次)
…
else:
无异常时处理语句块
finally:
必须要处理的语句块
(try:异常的捕获,except异常语句,finally断开数据库连接)
比如说捕获未被定义的变量b,NameError
try:
a = b + 1
except NameError as e:
print(type(e))
print(e)
print('2')
若要捕获多个就得加多个except语句
try:
print(10 / 0)
a = b + 1
except NameError as e:
print(type(e))
print(e)
except ZeroDivisionError as e:
print(type(e))
print(e)
except Exception as e:
print(e)
print('2')
简化代码可以将异常语句写在小括号里二合为一
try:
print(10 / 0)
a = b + 1
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
print('2')
无异常出现时else被执行,若有异常则被捕获,不执行else
try:
a = 1+1
# print(10 / 0)
# a = b + 1
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
else:
print("else")
print('2')
finally语句,不管有没有异常,finally里面的语句都会被执行
(所以finally语句中一般放入关闭资源的一些语句)
try:
a = 1+1
# print(10 / 0)
# a = b + 1
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
else:
print("else")
finally:
print("finallly")
print('2')
try:
a = 1+1
# print(10 / 0)
a = b + 1
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
else:
print("else")
finally:
print("finallly")
print('2')
python中所有的异常都是类,都是Exception的子类
(所以首字母都是大写的)
异常时需要事先定义然后才能使用的,python预先定义好的可以直接使用
一些常见的python内置异常如下:
1.2 主动抛出异常
raise
若捕获到了不知道如何处理的异常,我希望返回给调用我的人去处理
比如上面代码,可以将raise加在Exception语句后面,捕获异常然后将异常抛出,raise后面可以不带参数
raise后面带参数的话,可以按照我们的需求去抛出我们期望的类型,供调用者去处理,相当于将类实例化(name加小括号就相当于将类实例化)
try:
a = 1 + 1
# print(10 / 0)
# a = b + 1
a = int('abc')
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
print(type(e))
raise NameError('这是一个valueError')
else:
print("else")
finally:
print("finallly")
print('2')
1.3 创建自定义异常
解决一些特有的异常
先定义
class TranError(Exception):
def __init__(self, errorCode=500000, message='tranError'):
self.errorCode = errorCode
self.message = message
def __str__(self):
return "[%d] %s" %(self.errorCode, self.message)
将定义引用进来然后使用,
from ch8.TranError import TranError
try:
a = 1 + 1
raise TranError(500001, 'tranError')
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(e)
print(type(e))
else:
print("else")
finally:
print("finallly")
print('2')
2、程序调试 debug
debug:对程序调试的一种方法和能力
断点:让程序停下来的那个点(在行号点一下,出现红色)
比如在第7行停下来
然后debug
点击Step Over可以让程序一行一行运行
断点跳转
可以设置多个断点,调试完直接跳到下一个断点
(点击Run to Cursor )
每个开发工具都会有各自的调试方法,依赖于开发工具