Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 339|回复: 0

Python的常见异常处理

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-19 17:35:20 | 显示全部楼层 |阅读模式

    一、异常处理

      1、异常的概念

       异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那个就会抛出异常,并且程序的运行随即终止。

      2、错误种类

        分两种,第一种是:语法错误,这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正。

        常见语法错误:

     #TypeError:int类型不可迭代
        for i in 3: pass
        #ValueError
        num=input(">>: ") #输入hello
     int(num) #NameError
     aaa #IndexError
        l=['egon','aa'] l[3] #KeyError
        dic={'name':'egon'} dic['age'] #AttributeError 属性错误
        class Foo:pass Foo.x #ZeroDivisionError:无法完成计算
        res1=1/0 res2=1+'str' AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    View Code

        第二种是:逻辑错误,这是我们今天重点需要探讨的。

      3、逻辑错误的异常处理

        3.1、异常处理的意义:保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃。

        3.2 、这里又可以分为两种情况

          <1>如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防。     

    AGE=10
    while True: age=input('>>: ').strip() if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
            age=int(age) if age == AGE: print('you got it') break

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

           基本语法:

    try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑

          示例:

    try: f = open('test.txt','r',encoding='utf-8') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') except StopIteration: print('迭代出错')
    View Code

     

    二、try...except详解

      1、多分支:

        被检测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑。 

    s1 = 'hello'
    try: int(s1) except IndexError as e:  # 将异常信息传给变量e
        print(e) except KeyError as e: print(e) except ValueError as e: print(e)

      2、万能异常

        被检测的代码块抛出的异常有多种可能性,并且我们针对所有的处理逻辑只用一种就可以了。

    s1 = 'hello'
    try: int(s1) except Exception as e: print('发生异常',e)

      3、可以在多分支后来一个Exception 

    try: #name
        print('--->1') l = [1,2,3,4] #l[5]
        print('--->2') d = {} #d['name']
        print('---->3') except NameError as e: print('--->',e) except IndexError as e: print('--->',e)  # list index out of range
    except KeyError as e: print('--->',e) except Exception as e: print('万能异常检测方法') else: print('没有发生异常时执行') finally: print('不管代码块是否有异常都会执行') print('====== end ======')
    View Code

      4、末尾加上finally的用处

    try: f = open('test.txt','r',encoding='utf-8') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') print(next(f),end=' ') finally:  # 资源回收时使用,不论是否发生异常都会执行
        f.close()
    View Code

      5、主动触发异常:raise,异常类型值

    class People: def __init__(self,name,age): if not isinstance(name,str): raise TypeError('名字必须为str类型') if not isinstance(age,int): raise TypeError('年龄必须为正整数') self.name = name self.age = age p = People('cc',21)

      6、自定义异常

    class EgonException(BaseException): def __init__(self,msg): self.msg=msg def __str__(self): return self.msg try: raise EgonException('类型错误') except EgonException as e: print(e)

      7、断言:assert 条件

    assert 1 == 1
    assert 1 == 2

    小结:try...except

      保证了程序的安全性,不至于一点错误就导致整个程序崩溃,将错误和正常工作分开,更容易组织代码。

      

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 17:53 , Processed in 0.072350 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表