首页 > 其他分享 >14. 异常处理

14. 异常处理

时间:2024-12-06 21:04:04浏览次数:5  
标签:语句 14 处理 except try 出现异常 print 异常

一、什么是异常

  程序在运行过程之中,不可避免的出现一些错误,比如:使用了没有赋值的变量、使用了不存在的索引、除 0 等等。这些错误在程序中,我们称之为异常。程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行。

二、异常的传播

  当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会继续传播。如果函数中不会对异常进行处理,,则异常会继续向函数调用处传播。如果函数调用处处理了异常,则不再传播,如果没有则继续向调用处传播。直到传递到全局作用域(主模块),如果依然没有处理,则程序终止,并显示异常信息。

  当程序运行过程中出现异常以后,所有的异常信息会被保存在一个专门的异常对象,而异常传播时,实际上就是异常对象抛给了调用处。比如,ZeroDivisionError 类的对象专门用来表示除 0 的异常,NameError 类的对象专门用来处理变量错误的异常。在 Python 中提供了多个异常对象。

def fun1():
    a  = 10 / 0

def fun2():
    fun1()

def fun3():
    fun2()

fun3()

三、异常处理机制

  程序运行时出现异常,目的并不是让程序直接终止。Python 是希望在出现异常时,我们可以编写代码来对异常进行处理。遇到异常时,Python 中有两种处理机制。

3.1、try…except机制

  在 Python 中,提供 try…catch 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 子句中,把处理结果放在 except 子句中。这样,当 try 子句中的代码块出现异常时,就会执行 except 语句块中的内容。如果 try 语句块中代码没有异常,那么 except 语句块不会执行。这样我们就可以通过代码来处理异常,避免因为一个异常导致整个程序的终止。

  我们还可以在原有的基础上在添加一个 else 子句,用于指定当 try 语句块中没有出现异常时要执行的语句块。该语句块中的内容当 try 语句中发现异常时,将不被执行。

  我们还可以在添加一个 finallty 子句。该子句中的代码无论是否发生异常都会被执行。

try:
    代码块(可能出现异常的代码)
except [异常名 [as 异常对象名]]:
    代码块(出现错误以后的处理方式)
[else:
    代码块(没出现时要执行的语句)]
[finally:
    代码块(无论是否出现异常,该子句都会执行)]

  如果 except 后面不跟任何内容,则此时它会捕获所有的异常。

print("异常处理之前")

try:
    # try中放置的是可能错误的代码
    print(10/0)
# 如果except后不跟任何内容,此时它会获取所有的错误
except:
    # except中放置的是出现以后的处理代码
    print("出现异常")
# 这是一个可选的结构,表示没有出现异常要执行的代码
else:
    print("程序正常异常,没有错误")
# 这是一个可选结构,表示无论是否出现异常,最后都要执行的语句
finally:
    print("无论是否出现异常,该子句都会执行")

print("异常处理之后")

  如果 except 后面跟者异常类型,那么该类型对应的异常。我们还可以在在异常类后面跟着一个 as xxx,此时 xxx 就是异常对象。

try:
    # try中放置的是可能错误的代码
    print(10/0)
    print(a)
    1 + "hello"
# 如果except后不跟着异常的类型,那么它只会捕获该类型对应的异常
# 可以在异常类后面跟着一个 as xxx,此时xxx就是异常对象
except NameError as e:
    # except中放置的是出现以后的处理代码
    print("出现NameError")
    print(e)
except ZeroDivisionError as e:
    # except中放置的是出现以后的处理代码
    print("出现ZeroDivisionError")
    print(e)
# Exception 是所有异常类的父类
# 如果except后跟的是 Exception,它会捕获所有的异常
except Exception as e:
    print("未知异常")
    print(e)

在使用 try…except语句捕获异常时,如果在 except 后面不指定异常名称,则表示捕获全部异常;

在使用 try…except语句捕获异常时,当程序出现异常并处理完后,程序继续执行;

我们可以在 except 语句后面使用一对小括号将可能出现的异常名称括起来,多个异常之间使用逗号分隔。

3.2、raise机制

  如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise 语句在函数或方法中抛出异常。

raise [异常类型名[异常描述]]

  如果异常类型名为可选参数,它用于指定抛出的异常名称以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。异常描述也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。

def div(a,b):
    if b == 0:
        # raise用于向外部抛出异常
        # 后面可以根一个异常类,或异常类的对象
        raise ZeroDivisionError("除0异常")
    return a/b

print(div(10,0))

四、自定义异常类

  我们也可以自定义异常类,只需要创建一个类继承 Exception 类即可。

class MyException(Exception):
    pass

标签:语句,14,处理,except,try,出现异常,print,异常
From: https://blog.csdn.net/flurry_heart/article/details/144275562

相关文章

  • 通义开源语音处理框架 ClearerVoice-Studio;亚马逊 Nova 计划明年发布端到端语音模型丨
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • SpringBoot返回Long型数据前端精度丢失问题处理
    新建一个类,实现 WebMvcConfigurer接口,重写 extendMessageConverters方法,启动类上添加 @EnableAutoConfiguration注解importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.......
  • MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门
    MySQL数据库写入异常,主库内存溢出,扩容+清理buff/cach!很开门最近数据出现了两次写入异常报错如下:org.springframework,jdbc.UncategorizedsQlException:PreparedstatementCallback;uncategzed50LExcention[sql语句]TheMysOlserverisrunningwiththe--read-onlyoption......
  • 大二上 国际化科研素养实训(计算机科学)人工智能:机器学习在数据分析及自然语言处理中的
    20241206出成绩了,本次考试成绩满分题目如下:单选题(5分)Azoologistworkingatalakewouldliketoestimatetheageofafishinyearsbylookingatthelength,weight,colorandmaximumwidth.WhatMLtaskisthis?(B)AClassificationBRegressionCRecom......
  • Java和.Net互相使用RSA加密时的问题和处理方法
    前言我们产品是使用JAVA语言开发的,有个供第三方获取Token的接口,过程大概就是第三方先调一个注册接口,获取一个RSA公钥,然后用通过公钥加密后的一些认证信息调用获取Token的接口,如果信息无误,则发放Token。前段时间就遇到了对方是使用.Net进行开发的系统,在第一步获取公钥时没用问题,......
  • 2024-2025-1 20241401 《计算机基础与程序设计》 第十一周学习总结
    班级链接2024计算机基础与程序设计作业要求第十一周作业作业目标①计算机网络②网络拓扑③云计算④网络安全⑤Web⑥HTML,CSS,Javascript⑦XML教材学习内容总结《计算机科学概论》第15、16章第15章计算机网络基础网络类型局域网(LAN):通常覆盖范围较小......
  • 2024-2025-1 20241407《计算机基础与程序设计》第十一周学习总结
    作业信息这个作业属于哪个课程2024-2025-1计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第十一周作业这个作业的目标计算机网络,网络拓扑,云计算,网络安全,Web,HTML,CSS,Javascript,XML作业正文本博客教材学习内容总结《计算机科学概论......
  • DedeCMS最新注入漏洞(CNVD-2024-44514、CVE-2024-9076)
    DedeCms系统(织梦系统)是一套PHP开发的网站管理系统,因其功能强大,操作使用简单,具有非常高的知名度,拥有大量用户。 国家信息安全漏洞共享平台于2024-11-07公布其存在跨站脚本漏洞。漏洞编号:CNVD-2024-44514、CVE-2024-9076影响产品:DeDeCMS<=5.7.115漏洞级别:中公布时间:2024-11-......
  • 3. 手机话费异常(cqupt)
    3.手机话费异常【问题描述】定义了一个接口PayAble,包含计算电话话费的方法pay()。在手机类定义中增加计算话费异常,如果话费小于0则抛出异常。要点提示:1)  自定义一个异常类,表示话费小于0的异常;2) 计算话费时如果小于0则抛出异常,在测试类中处理异常。【输入形式】无【......
  • HTML5系列(14)-- 链接与资源关系指南
    前端技术探索系列:HTML5链接与资源关系指南......