异常处理

异常处理:
一、什么是异常
 1.异常是错误发出的信号
   程序一旦出错,如果程序中还没有相应的处理机制
   那么该错误就会产生一个异常抛出来
   程序的运行也随之终止

 2.一个异常分为三部分:
    1.异常的追踪
    2.异常的类型
    3.异常的值

 3.异常的分类:
    1.语法异常:(这种错误,根本过不了python解释器的语法检测)

这类异常应该在程序执行前就改正
print('start.......')
x=1
x+=1
if
print('stop.....')

    2.逻辑上的异常:

IndexError:   #IndexError: list index out of range
l=['a','b']
l[3]             

KeyError:  #KeyError: 'b'
d={'a':1}
d['b']         

AttributeError:  #AttributeError: type object 'Foo' has no attribute 'x'
class Foo:
     pass
Foo.x         

ValueError:   #ValueError: I/O operation on closed file
f=open('a.txt','r',encoding='utf-8')
f.close()
f.readline()       

ValueError:   # invalid literal for int() with base 10: 'aaaaa'
int('aaaa')

TypeError:     #'int' object is not iterable
for i in 333:
      pass

NameError:   #name 'x' is not defined
x

ZeroDivisionError:     #division by zero
1/0


二、异常处理
为了保证程序在遇到错误时不会崩溃,我们需要对异常进行处理。
1.如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

while True:
     age=input('输入').strip()
     if age>18:
        print('猜大了')
     elif age<18:
        print('猜小了')
     eles:
        print('猜对了')
        break

2.如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

#单分支
try:
    print('start.....')
    x=1
    y
    l=[]
    l[3]
    d={'a':1}
    d['b']
    print('end....')
except NameError:
    print('变量名没有定义')
print('other.....')

#多分支
try:
    print('start.....')
    x=1
    # y
    l=[]
    l[3]
    d={'a':1}
    d['b']
    print('end....')
except NameError:
    print('变量名没有定义')
except KeyError:
    print('字典的key不存在')
except IndexError:
    print('索引超出列表的范围')
print('other.....')


#多种异常采用同一段逻辑处理
try:
    print('start.....')
    x=1
    # y
    l=[]
    # l[3]
    d={'a':1}
    d['b']
    print('end....')
except (NameError,KeyError,IndexError):
    print('变量名或者字典的key或者列表的索引有问题')
print('other......')


#万能异常:   #获取异常的值
try:
    print('start.....')
    x=1
    y
    l=[]
    l[3]
    d={'a':1}
    d['b']
    import os
    os.aaa
    print('end....')
except Exception as e:
    print('万能异常---》',e)
print('other.....')

3.try...else...
       else:不能单独使用,必须与except连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常的情况下执行
4.try...finally...
      finally:无论有没有异常发生,都会执行,finally的子代码块中通常放回收系统资源的代码

#1、
try:
    print('start.....')
     x=1
     y
     l=[]
     l[3]
     d={'a':1}
     d['b']
     import os
     os.aaa
    print('end....')
except NameError as e:
    print('NameError: ',e)

except Exception as e:
    print('万能异常---》',e)

else:
    print('在被检测的代码块没有出现任何异常的情况下执行')
finally:
    print('无论有没有异常发生,都会执行')
print('other.....')


#2、
try:
     f=open('a.txt',mode='w',encoding='utf-8')
     f.readline()
finally:
    f.close()       #回收系统资源

print('other....')

5.自动触发异常

raise TypeError('类型错误')

class People:
     def __init__(self,name):
          if not isinstance(name,str):
               raise TypeError('%s 必须是str类型' %name)
          self.name=name

p=People(123)

6.断言

print('part1....')
stus=['gao','egon','wxx']

assert len(stus) >0

print('part2......')

7.自定义异常:并不是所有的功能都要自己写,可以用继承,(BaseException):所有异常的基类

class RegisterError(BaseException):
      def __init__(self,msg,user):
            self.msg=msg
            self.user=user

      def __str__(self):
            return '<%s:%s>' %(self.user,self.msg)

raise RegisterError('注册失败','teacher')

三、什么时候用异常处理
首先try...except是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的,这种东西加的多了,会导致你的代码可读性变差。
异常处理只有在错误发生的条件无法预知的情况下,才应该它。
异常处理能不用就别用。



转载于:https://www.cnblogs.com/gaobei/articles/8877030.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值