Python 异常处理-python2/3差别

1、常见异常类

异常描述
NameError尝试访问一个没有申明的变量
ZeroDivisionError除数为0
SyntaxError语法错误
KeyError请求一个不存在的字典关键字
IndexError索引超出序列范围
AttributeError尝试访问未知的对象属性
ValueError传参类型不正确
FileNotFoundError文件不存在
AssertionError断言异常 assert判断 不对就会报异常
IOError读取不存在的文件
IndentationError: unexpected indent缩进错误

示例

#NameError
print(abc)

#ZeroDivisionError
print(1/0)

#IndentationError  缩进问题
print("abc")

#IndexError
lst = [1,2,3]
print(lst[5])

#SyntaxError
if 1>0::
   print("ok")

#KeyError
a = {"s1":1}
print(a.get("s2",0))
print(a["s2"])

#AttributeError
import random
random.xxx()

#ValueError
int("abc")

#AssertionError 断言
a = 3
b = 4
assert  a<b

2、异常处理

try:
    ggg
    a = 1 / 0
    int("abc")
except ValueError as e:
    print(e)
except ZeroDivisionError:
    print("除数为0")
except NameError as b:
    print("b...")
    print(b)
except Exception as a:
    print("a...")
    print(a)  
else:        # 没有任何异常发生的时候执行的
    print("没有异常") 
finally:     # 不管有没有异常和异常有没有被捕获,都会执行 
    print("I am Finally")   
  • except 捕获错误与触发的错误不一致,程序就捕获不到,抛出异常
    如果父类异常捕获放在最前面,就会吞噬后面的子类异常

  • finally 不管有没有异常和异常有没有被捕获,都会执行 ,即使已经抛出异常并且已经return, finally体里面的代码都会运行

3、手动触发异常

raise手动触发异常
raise异常类(“说明信息”)
raise没有接异常类,默认抛出RuntimeError异常类

try:
    print("start raise....")
    # raise
    # raise IndexError
    raise IndexError("this is test")
except IndexError as i :
    print("IndexError:this is test")
    print(i)
except Exception as e:
    print("exception error")
    print(e)

4、嵌套异常

在这里插入图片描述

4.1 异常处理注意事项

* 只执行最先匹配的一个except
* 如果父类异常在最前面,会吞噬子类所有异常
* 多excpet注意:
只会匹配一个except
 要先写子类异常再写父类异常
若果except捕获的错误与触发的错误不一致,程序会捕获不到

4.2 几点建议

不建议使用异常来代替常规的检查,如  if ... else判断
避免过多依赖于异常处理机制
在必要的时候,可以手动引发异常(raise==>函数或方法

4.3 try/except/finally使用return

finally中使用return,异常无法回溯
在函数中的try/except 语句中使用return后,仍然会执行finally 中的内容
- finally==>正常或异常都会执行
- return==> 直接退出函数,返回值给主程序

5、关于性能

在这里插入图片描述
在这里插入图片描述
执行脚本命令之前+time 获取命令执行的时间
可以发现for循环在try里面 好一点

6、Python2 VS Python3

6.1 输入输出

输入

python2: input默认接收int类型,str类型接收需要使用引号包起来
          raw_input得到一个str类型
Python3: input得到str类型

输出

python2中:两种都可以
python3中:只能作为函数输出
>>> print "ok"
ok
>>> print("ok")
ok

6.2 数据类型/地板除

Python2:整型区分 长整型和整型
Python3:都是整型
>>> a=99999999999999999999999999999  # python2
<type 'long'>
>>> a=99999999999999999999999999999  # python3
>>> type(a)
<class 'int'>
Python2:实际是地板除,要想得到真除,变成浮点数再相除
Python3:就是真除
>>> 5/3      # python2  地板除,要想真除,只能将数据变成浮点型
1
>>> 5.0/3
1.6666666666666667

>>> 5/3         # python3 真除,除多少是多少。//才是地板除
1.6666666666666667 

6.3 range与xrange

Python2:range(4),结果是一个列表生成[0,1,2,3]xrange返回一个生成器,使用的时候再创建对象
Python3:range就是Python2的xrange 
         # 注:自己本身没有xrange函数
# python2
>>> range(4)     
[0, 1, 2, 3]  # 注:生成的是列表,一次性加载到内存里面,一开始就生成一个列表,一次性返回
>>> xrange(4)  # 注:占的内存比range小
xrange(4)

# python3
>>> range(4)				# 注:python3里没有xrange
range(0, 4)				# 注:生成器,取的时候才生成这个数

6.4 异常机制

Python2:可以用 , (逗号)也可以用as
Python3:只能用as # 注:把信息赋给一个标识符的时候
try:
    print("ok")
except Exception,e: # python2中用, python3中用as
    print("exception error")

6.5 字符编码

Python2:默认编码为ascii码
Python3:默认编码方式utf-8
Python2中含有中文 要声明编码方式
#-*-coding: utf-8-*-	# 注:方法1
encoding=utf-8		# 注:方法2

6.6 布尔类型

Python2:TrueFalse可以定义成标识符,可以改变
Python3:TrueFalse变成了关键字,不能修改
>>> True=2  # python2
>>> False=3
>>> True=2  # python3
  File "<stdin>", line 1
SyntaxError: can't assign to keyword

6.7 模块导入

Python2:默认使用相对导入
Python3:默认是绝对导入

Python2 future
使用__future__模块 向后兼容 # 注:比如python2 想使用python3的语法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个手刹不太灵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值