Skr-Eric的Python课堂(十六)——Python的异常

异常 exception

  什么是错误

    错误是指由于逻辑或语法等导致一个程序无法正常执行的问题

  什么是异常

    异常是程序出错时标识的一种状态

    当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态

    作用:

      用作信号,通知上层调用者有错误产生需要处理

 

try语句的两种法

  try-except语句

  try-finally语句

 

try-except语法

  try:

      可能触发异常的语法

  except 错误类型1 [as 变量1]:

      异常处理语句1

  except 错误类型2 [as 变量2]:

      异常处理语句2

  except (错误类型3,错误类型4):

      异常处理语句3

  ....

  except:

      异常处理语句other

  else:

      末发生异常语句

  finally:

      最终语句

 

  作用:

     偿式捕获异常(接收异常通知),将程序转为正常状态并继承执行

    

  语法说明:

    as 子句是用于绑定错误对象的变量,可以省略

    except 子句可以有一个或多个,但至少要有一个

    else 子句最多只能有一个,也可以省略不写

    finally 子句最多只能有一个,也可以省略不写

  示例:

try:
    n = int(input("请输入整数:"))
except int:  # 错误,int类型不能当成错误类型用于try-except语句中
    pass

 

try-finally语句

  语法:

    try:

        可能触发异常的语句

    finally:

        最终语句

  说明:

    finally 子句不可以省略

    一定不存在except子句

  作用:

    通常用try-finally语句来做触发异常时必须要处理的事情,无论异常是否发生,finally子句都会被执行

    try-finally 语句不会改变程序的(正常/异常状态)

 

  示例:

def fry_egg():
    print("打开天燃气...")
    try:
        count = int(input("请输入鸡蛋个数: "))
        print("完成煎鸡蛋,共煎了%d个鸡蛋!" % count)
    finally:
        print('关闭天燃气')

try:
    fry_egg()
except:
    print("程序出现过异常,已转为正常状态")

print("程序正常退出")

 

try语句嵌套

  try嵌套是指一个try语句嵌套在另一个try语句内使用

 

  示例:

# 此示例示意try语句嵌套,在内层的try语句如果已经把状态转为正常状态
# 则外层的try语句将收不到错误通知

try:
    try:
        n = int(input("请输入整数:"))
    except ValueError:
        print("在内层try语句内出现值错误,已转为正常状态")
    else:
        print("内层try语句没有出现异常")
except:
    print('外层的try语句接收到的异常通知.已处理并转为正常状态')
else:
    print("外层try语句没有出现异常")

 

raise 语句:

  作用:

    触发一个错误,让程序进入异常状态

    发送错误通知给调用者

  语法:

    raise 异常类型

    或

    raise 异常对象

    或

    raise  # 重新触发上一次异常

  示例:

def make_except():
    print("开始")
    # raise ValueError  # 故意发送一个错误通知
    # e = ValueError("这是故意制作的一个错误!")
    # raise e
    raise ZeroDivisionError

    print("结束")

try:
    make_except()
except ValueError as err:
    print("make_except 发出了ValueError类型的错误,已捕获")
    # 错误的原因如何获得?
    print("错误的值是:", err)

print("程序结束")
def make_except():
    print("开始_make_except")
    raise ValueError("我的一个值错误!")
    print("结束....")

def get_except():
    try:
        make_except()
    except ValueError as err:
        print("错误的值是:", err)
        raise  # 重新触发刚收到的错误 等同于raise err

try:
    get_except()
except ValueError as err:
    print("get_except内部发生值错误!", err)

print("程序结束")

 

assert 语句(断言语句)

  语法:

    assert 真值表达式, 错误数据(通常是字符串)

  作用:

    当真值表达式为False时,用错误数据创建一个AssertionError类型的错误raise出去,并进入异常状态

  等同于:

    if 真值表达式 == False:

       raise AssertionError(错误数据)

  示例:

class A:
    v = 100
    def __init__(self):
        self.v = 200
a1 = A()
a2 = A()
del a2.v
print(A.v)
print(a1.v)
print(a2.v)
print(a1.__class__.v)

 

为什么要用异常处理机制

  在程序调用层数较深时,向主调函数传递错误信息需要层层return 返回比较麻烦,所以用异常处理机制

 

示例:

def f1():
    print("开始盖房子打地基...")
    # err = ValueError("打地基挖出古物,停止施工")
    # return err
    print("地基完成")

def f2():
    print("开始盖房子地面以上部分....")
    err = ValueError("要建高压线...停止施工")
    return err
    print("地面以上部分完工")

def f3():
    '''第一承包商开始找人盖房子'''
    r = f1()
    if r is not None:
        return r
    r = f2()
    if r is not None:
        return r

def build_house():
    '''第一承包商开始找人盖房子'''
    r = f3()
    if r is not None:
        return r

r = build_house()
if r is not None:
    print("出错:", r)

 

课后习题:

  1. 一个球从100米高空落下,每次落地后反弹高度是原高度的一半,再落下

      写程序算出皮球在第10次落地后反弹高度是多高?

      打印出共经过了多少米的路程

 

  2. 分解质因数: 输入一个正整数,分解质因数:

    如输入:

      90

    则打印:

      '90=2*3*3*5'

      (质因数是指小数最小能被原数整除的素数(不包含1))

 

  3. 修改原学生信息管理程序,加入异常处理语句,让程序在任何情况下都能按逻辑正常执行

    如: 输入成绩和年龄时,如果用户输入非法空符串也不会导致程序崩溃

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值