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

14. 异常处理

时间:2024-10-08 19:32:42浏览次数:1  
标签:语句 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://www.cnblogs.com/FlurryHeart/p/18452354

相关文章

  • 每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))
    前言每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量。想细看的可以去官网下载,或者下面自取阿里巴巴Java开发手册(终极版)五、集合处理【强制】关于ha......
  • CF1406E Deleting Numbers
    题意简述交互题,给定集合\(S=\{1,2,\cdots,n\}\)和一个隐藏的数\(m\),你需要使用不超过\(10^4\)次操作猜出\(m\),操作类型如下:Ax,查询在\(S\)中是\(x\)的倍数的数的个数。Bx,查询在\(S\)中是\(x\)的倍数的数的个数,并把这些数删去,但是\(m\)不会被删去。Cx,表示你......
  • EBS 发票状态【选定发票以便付款】处理
    当发票状态为【选定发票以便付款】时,无法再发起发票的完全支付处理处理方式:1、在计划付款页签页面找到如下的付款请求2、打开【付款管理器】界面,将发票界面的【付款请求】放到【付款处理请求】栏位进行查询,将查询道德数据终止即可3、付款请求终止后,发票状态变为【已验证......
  • DSP概述及应用——TMS320DM6437ZDU4、TMS320DM6437ZWT6、TMS320DM6437ZWT7数字媒体处
    概述:TMS320DM6437是一款DSP芯片,具有强大的处理能力和丰富的功能模块。TMS320DM6437采用基于超标量架构的C64x+内核,具有高效的乘法累加单元和多格式指令集,能够在单个时钟周期内执行两条指令,大大提高了运算速度和效率。TMS320DM6437采用基于超标量架构的C64x+内核,具有高效的乘法累......
  • 【斯坦福CS144】Lab2
    一、实验目的实现一个TCPReceiver,用以接收传入的TCPsegment并将其转换成用户可读的数据流。二、实验内容1.接收TCPsegment;2.重新组装字节流(包括EOF);3.确定应该发回给发送者的信号,以进行数据确认和流量控制。三、实验过程输入gitmergeorigin/check2-startercode......
  • 接口自动化如何处理接口依赖问题
    一、最近研究接口自动化发现处理接口依赖有好几种方式1.全局变量首先设置none,然后在上一个接口取出来,用的时候global声明一下2.setUp:放到setUp里面3.利用反射原理:先设置为None,然后setattr(),用的时候在getattr()4.放到缓存里面os.environ:用的时候在取出来,os.environ['t......
  • 《如 何 速 通 一 套 题》14.0
    邮寄核爆赛,拿完暴力走人了......A(由于题目名称为“我是A题”所以省略,下同)我们处理掉整个整个的\(A\timesB\)的面,然后从上往下倒序枚举C。当枚举到一个C时,我们把这个C独有的贡献加上去(这就是为什么要倒序枚举C)。由于本题数据太水,暴力可过。理论上可以线段树优化,但......
  • 循环处理数据的小轮子
    1.基于某个字段比如要处理一批数据,把id作为查询条件,500条数据作为一个批次工具类代码如下:publicclassDataLoopUtil{/***基于某个字段(比如id,createTime等),循环处理数据*P>Param*R>Result**@paramdataQueryFunction......
  • 那么使用restTemplate 的情况下,如果postForObject方法抛出了异常,那么在catch块中还能
    在使用RestTemplate的情况下,调用如postForObject()方法时,如果抛出了异常,比如HTTP4xx或HTTP5xx状态码导致的异常,默认情况下,异常中不会直接包含完整的HTTP响应体(responsebody)。然而,RestTemplate抛出的异常类确实包含了部分响应信息,比如状态码和响应头。通常,如果post......
  • 数据清洗 微信:a1319614038
    #stata数据清洗整理合并筛选匹配#excel数据匹配合并筛选匹配#python数据清洗整理合并筛选匹配抓取,请直接说明具体要求发给我,我会第一时间回复你,#vlookup函数应用,vlookup功能实现,#CSV文件处理,超大文件,超过显示,#拆分,统计,批量处理,大量数据文件合并,#匹配合并,矩阵文件,各种问题解决。数......