首页 > 其他 > 详细

第20课 异常处理

时间:2020-07-01 18:34:31      阅读:58      评论:0      收藏:0      [点我收藏+]

知识点汇总:

异常的定义:

当解释器遇到错误(无法执行)的代码,就会中断当前代码的执行,抛出一个异常对象。

1、python是解释型语言,没有报错可以执行---到报错那行代码,之后的代码不执行

2、使用try---except捕获异常       捕获多种异常:try  ---except  异常1    except  异常2.....except  异常n

      捕获特定异常:try except  as e:

3、捕获所有异常:有时候我们并不知道会抛出什么异常,这时候可以用捕获所有异常。

  1--try  可能出现异常的代码块    except Exception as e:       等价于 try   except  :-traceback.format_exc()----打印详细信息  ,需要import traceback

  Exception  指明所有异常(父类)

4、finally语句:不管是否有异常,都会去执行一段代码,finally一定要放在最后。

5、else语句:没有异常的情况下,要执行的一段代码

  1--else必须跟在所有的except代码块后面

  2--在finally前面

6、函数调用栈

  1--异常发生:解释器中断当前代码的执行,并抛出一个异常对象,并在函数的调用栈从下到上,层层的寻找捕获处理该异常的代码。如果能找到就执行对应的代码

      如果不能则会一直找到最外层的函数结束本次执行

  2、使用raise向上层抛出异常

 

7、自定义异常

  1---继承自Exception     

    class NameTooLongError(Exception)

      pass

    class NameTooLongError(Exception)

      pass

  2、使用raise抛出

    raise NameTooLongError

  3、抛出异常常用在:

    1--当函数里面出现错误,代码无法继续进行执行的时候

    2、告诉上层调用代码,什么样执行产生了错误

    3、由上层调用代码决定如何处理

 

 

 

 

示例程序

1-1   没有定义

print(name)  #变量name没有定义

1-2  需要加判断

while True:
    num = input(input a number:)
    if num != 0 and num.isdigit(): # 加判断条件,除数不能为0,且必须为数字。
        print(10000 / %s = %s %(num, 10000/int(num)))
    else:
        print(input a error, please try again!)

2-1 使用try except 捕获异常

while True:
    num = input(input a number:)
    try:
        print(10000/ %s  = %s % (num, 10000/int(num))))
    except ZeroDivisionError:
        prinit(please input again!)

2-2  如下面的例子,使用try except进行了异常处理,如果除数为0时,直接字形except后面的打印语句。这时,因为name没被执行,所以没报错。

while True:
    num = input(input a number:)
    try:
        print(10000/ %s = %s % (num, 10000/int(num)))
        name  # 此处虽然name 没有定义,但是不会报错,因为当除数为0时,上面的print语句直接出错,跳到了except之后的语句。name 没执行,所以没报错。
    except ZeroDivisionError:
        print(请重新输入!)

2-3 捕获多种异常

while True:
    num = input(input a number:)
    try:
        print(10000/ %s = %s % (num, 10000/int(num)))
    name
    except ZeroDivisionError:
        print(请重新输入!)
    except NameError:  #多种异常用多个except
        print(变量name没有定义!)

2-4  捕获特定异常

while True:
    num = input(input  a number:)
    try:
        print(10000/ %s = %s % (num,  10000/ int(num)))
        name
    except ZeroDivisionError:
        print(请重新输入:)
    except  NameError  as  e:
        print(e, 有变量未定义!)


执行结果:

D:\Python\python.exe "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py"
input a number:1
10000 / 1 = 10000.0 
name name is not defined 变量未定义!
input a number:

3-1  捕获所有异常

while True:
    num = input(input a number:)
    try:
        print(10000/ %s = %s % (num,  10000/int(num)))
        name
    except Exception as e:  # 捕获所有异常
        print(e)



执行结果:
D:\Python\python.exe "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py"
input a number:1
10000 / 1 = 10000.0
name name is not defined
input a number:0
division by zero
input a number:

3-2  另外一种写法,需要先导入tracebaclk

import traceback
while True:
    num = input(input a number:)
    try:
        print(10000 / %s = %s % (num, 10000/int(num)))
        name
    except:
        priint(traceback.format_exc())

执行结果
Traceback (most recent call last):
  File "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py", line 68, in <module>
    name
NameError: name name is not defined

input a number:0
Traceback (most recent call last):
  File "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py", line 67, in <module>
    print(10000 / %s = %s % (num, 10000 / int(num)))
ZeroDivisionError: division by zero

6-1 向上抛出异常

def f3():  #等级最低---区
    print(in f3 --begin)
    try:
        b = 4/0
    except ZeroDivisionError:
        print()
        raise    # 向上层抛出异常
    print(in f3 --end)

def f2():  #
    print(in f2 --begin)
    f3()
    print(in f2 --end)


def f1():
    print(in f1 --begin)
    f2()
    print(in f1  --end)

7-1 自定义异常

class NameTooLongError(Exception): #自定义异常的名字
    pass

class NameTooShortError(Exception):  #自定义异常名字
    pass


def inPutName():
    name = input(请输入用户名:)
    if len(name) > 10:
        raise NameTooLongError
    elif len(name) < 6:
        raise NameTooShortError


try:
    inPutName()

except NameTooLongError:
    print(你输入的用户名太长!)

except NameTooShortError:
    print(你输入的用户名太短!)

 

第20课 异常处理

原文:https://www.cnblogs.com/nick1998/p/13220528.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!