当前位置:首页 > 文章列表 > 文章 > python教程 > Python中的异常处理实例分析

Python中的异常处理实例分析

来源:亿速云 2024-04-13 16:36:30 0浏览 收藏

哈喽!今天心血来潮给大家带来了《Python中的异常处理实例分析》,想必大家应该对文章都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习文章,千万别错过这篇文章~希望能帮助到你!

    一、什么是异常

    在python中,错误触发的异常如下

    Python中的异常处理实例分析

    二、异常的种类

    在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误。

    1 、常用异常类

    • AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

    • IOError 输入/输出异常;基本上是无法打开文件

    • ImportError 无法引入模块或包;基本上是路径问题或名称错误

    • IndentationError 语法错误(的子类) ;代码没有正确对齐

    • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

    • KeyError 试图访问字典里不存在的键

    • KeyboardInterrupt Ctrl+C被按下

    • NameError 使用一个还未被赋予对象的变量

    • SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

    • TypeError 传入对象类型与要求的不符合

    • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

    • ValueError 传入一个调用者不期望的值,即使值的类型是正确的

    2、异常举例:

    # 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'

    三、异常处理

    1、基本语法try...except

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

    举例

    try:
        f = [ 'a', 'a', 'a','a','a', 'a','a',]
        g = (line.strip() for line in f) #元组推导式
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
        print(next(g))
    except StopIteration:
        f.close()

    异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

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

    2、多分支异常 except..except与万能异常:Exception

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

    3、try/except...else

    try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

    else 子句将在 try 子句没有发生任何异常的时候执行。

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()

    4、异常的最终执行finally

    try-finally 语句无论是否发生异常都将执行最后的代码。

    定义清理行为:

    s1 = 'hello'
    try:
        int(s1)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    #except Exception as e:
    #    print(e)
    else:
        print('try内代码块没有异常则执行我')
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')

    #invalid literal for int() with base 10: 'hello'

    #无论异常与否,都会执行该模块,通常是进行清理工作

    四、抛出异常raise

    Python 使用 raise 语句抛出一个指定的异常。

    raise语法格式如下:

    raise [Exception [, args [, traceback]]]
    try:
        raise TypeError('抛出异常,类型错误')
    except Exception as e:
        print(e)

    raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

    如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

    try:
            raise NameError('HiThere')
        except NameError:
            print('An exception flew by!')
            raise
       
    #An exception flew by!
    #Traceback (most recent call last):
    #  File "", line 2, in ?
    #NameError: HiThere

    五、自定义异常

    你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

    在这个例子中,类 Exception 默认的 __init__() 被覆盖。

    class EgonException(Exception):
        def __init__(self, msg):
            self.msg = msg
    
        def __str__(self):
            return self.msg
    
    
    try:
        raise EgonException('抛出异常,类型错误')
    except EgonException as e:
        print(e) 
    
    #抛出异常,类型错误

    基础异常类

    当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

    大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。

    class Error(Exception):
        """Base class for exceptions in this module."""
        pass
     
    class InputError(Error):
        """Exception raised for errors in the input.
     
        Attributes:
            expression -- input expression in which the error occurred
            message -- explanation of the error
        """
     
        def __init__(self, expression, message):
            self.expression = expression
            self.message = message
     
    class TransitionError(Error):
        """Raised when an operation attempts a state transition that's not
        allowed.
     
        Attributes:
            previous -- state at beginning of transition
            next -- attempted new state
            message -- explanation of why the specific transition is not allowed
        """
     
        def __init__(self, previous, next, message):
            self.previous = previous
            self.next = next
            self.message = message

    六、断言assert

    assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

    断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。

    语法格式如下:

    assert expression

    等价于:

    if not expression:
        raise AssertionError

    assert 后面也可以紧跟参数:

    assert expression [, arguments]

    等价于:

    if not expression:
        raise AssertionError(arguments)

    以下实例判断当前系统是否为 Linux,如果不满足条件则直接触发异常,不必执行接下来的代码:

    import sys
    assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    # 接下来要执行的代码
    
    # Traceback (most recent call last):
    #    File "C:/PycharmProjects/untitled/run.py", line 2, in 
    #      assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
    #  AssertionError: 该代码只能在 Linux 下执行

    理论要掌握,实操不能落!以上关于《Python中的异常处理实例分析》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

    版本声明
    本文转载于:亿速云 如有侵犯,请联系study_golang@163.com删除
    Golang中传递函数作为参数的技巧Golang中传递函数作为参数的技巧
    上一篇
    Golang中传递函数作为参数的技巧
    springboot项目出现”java: 错误: 无效的源发行版:17“问题怎么解决
    下一篇
    springboot项目出现”java: 错误: 无效的源发行版:17“问题怎么解决
    查看更多
    最新文章
    查看更多
    课程推荐
    • 前端进阶之JavaScript设计模式
      前端进阶之JavaScript设计模式
      设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
      542次学习
    • GO语言核心编程课程
      GO语言核心编程课程
      本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
      508次学习
    • 简单聊聊mysql8与网络通信
      简单聊聊mysql8与网络通信
      如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
      497次学习
    • JavaScript正则表达式基础与实战
      JavaScript正则表达式基础与实战
      在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
      487次学习
    • 从零制作响应式网站—Grid布局
      从零制作响应式网站—Grid布局
      本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
      484次学习
    查看更多
    AI推荐
    • 茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信
      茅茅虫AIGC检测
      茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
      111次使用
    • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
      赛林匹克平台(Challympics)
      探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
      127次使用
    • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
      笔格AIPPT
      SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
      130次使用
    • 稿定PPT:在线AI演示设计,高效PPT制作工具
      稿定PPT
      告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
      119次使用
    • Suno苏诺中文版:AI音乐创作平台,人人都是音乐家
      Suno苏诺中文版
      探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
      126次使用
    微信登录更方便
    • 密码登录
    • 注册账号
    登录即同意 用户协议隐私政策
    返回登录
    • 重置密码