第20课 异常处理

知识点汇总:

异常的定义:

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

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:Pythonpython.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:Pythonpython.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('你输入的用户名太短!')
原文地址:https://www.cnblogs.com/nick1998/p/13220528.html