Python-异常处理

1、什么是异常处理

异常是错误发生的信号,一旦程序出错就会产生一个异常
如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止
错误又分两种:

  1. 语法错误: 若出现,执行程序不会执行,须要执行前修正;
  2. 逻辑错误: 程序可以执行,运行中出现才会抛出。

异常信息由三部分组成

  1. 具体哪一行代码抛出的异常
  2. 异常的种类
常用异常
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
  1. 异常的内容及信息

2、异常的处理

为了增强程序的健壮性(稳定性\容错性),遇到错误不崩溃,我们需对异常进行处理;
针对语法错误: 应该运行前立即改正;
针对逻辑错误:

  1. 如果逻辑错误发生的条件是可以预知的,应该if判断解决,预防异常;
age = input('>>: ').strip()
 if age.isdigit():
     age=int(age)
     if age > 18:
         print('too big')
     elif age < 18:
         print('too small')
     else:
         print("got it")
 else:
     print('必须输入数字')
  1. 如果逻辑错误发生的条件是不可预知的,那么异常一个会发生,考虑到程序的健壮性我们应该处理异常,做好补救措施,需要用到try…except:在错误发生之后进行处理;
# 基本语法:
try:
    代码块
except 异常的类型:
    发生异常后要执行的代码
1、 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

s1 = 'hello'
try:
    int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错
    print e


2、 多分支

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
    
try:
   print("====>111")
   print("====>222")
   # xxx
   # l=[]
   # l[0]
   dic={}
   dic["k1"]
   print("====>333")
except (NameError,IndexError) as e:
   print("=---->",e)
except KeyError as e:
   print(e)

print('====>4')


3finally

# 无论try语句中是否抛出异常,finally中的语句一定会被执行
try:
    print("====>111")
    print("====>222")
    xxx=111
    # l=[]
    # l[0]
    dic={}
    # dic["k1"]
    print("====>333")
except (NameError,IndexError) as e:
    print("=---->",e)
except KeyError as e:
    print(e)
finally:
    print("一定会运行")
print('====>4')
# print(xxx)


4、 万能异常Exception

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)


5、主动触发异常

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)


6、自定义异常

class Interface(BaseException):
    def __init__(self, msg, x, y, z):
        self.msg = msg
        self.x = x
        self.y = y
        self.z = z

    def __str__(self):
        return "<%s:%s:%s:%s>" % (self.msg,self.x,self.y,self.z)


raise Interface("接口异常", 11, 22, 33)

7、断言  assert 条件

print("====1")
print("====2")
print("====3")
salaries=[1.1,2.2,2]

assert len(salaries) == 3 # 符合继续运行,否则抛出异常

print(salaries[2])
print(salaries[2])
print(salaries[2])


8、 总结try..except

1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值