Python 异常处理

异常:

当Python检测到⼀个错误时,解释器就⽆法继续执⾏了,会出现⼀些错误的提示,这就是所谓的"异常"。

看如下示例:

print('-----test--1---')
open('123.txt','r')
print('-----test--2---')

打开⼀个不存在的⽂件123.txt,当找不到123.txt ⽂件时,就会抛出给我们⼀个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的⽂件或⽬录)

 


异常处理

1. 捕获异常 try...except...
看如下示例:

try:
    print('-----test--1---')
    open('123.txt','r')
    print('-----test--2---')
except IOError:
    pass

说明:

  • 此程序看不到任何错误,因为⽤except 捕获到了IOError异常,并添加了处理的⽅法
  • pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息

⼩总结:

  • 把可能出现问题的代码,放在try中
  • 把处理异常的代码,放在except中

 

2. except捕获多个异常
看如下示例:

try:
    print num
except IOError:
    print('产⽣错误了')

想⼀想: 上例程序,已经使⽤except来捕获异常了,为什么还会看到错误的信息提示?

  • 答: except捕获的错误类型是IOError,⽽此时程序产⽣的异常为 NameError ,所以except没有⽣效

修改后的代码为:

try:
    print(num)
except NameError:
    print('产⽣错误了')

实际开发中,捕获多个异常的⽅式,如下:

try:
    print('-----test--1---')
    open('123.txt','r') # 如果123.txt⽂件不存在,那么会产⽣ IOError 异常
    print('-----test--2---')
    print(num)# 如果num变量没有定义,那么会产⽣ NameError 异常
except (IOError,NameError):
    #  如果想通过⼀次except捕获到多个异常可以⽤⼀个元组的⽅式

注意:

  • 当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使⽤元组的⽅式仅进⾏存储

 

3. 获取异常的信息描述

Python 异常处理_第1张图片

 

4. 捕获所有异常

Python 异常处理_第2张图片

 

5. else
        咱们应该对 else  并不陌⽣,在if中,它的作⽤是当条件不满⾜时执⾏的实⾏;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执⾏else中的事情。

try:
    num = 100
    print num
except NameError as errorMsg:
    print('产⽣错误了:%s'%errorMsg)
else:
    print('没有捕获到异常,真⾼兴')

运行结果如下:

Python 异常处理_第3张图片



6. try...finally...
        ⽆论异常是否产⽣都要执⾏,那么此时就需要使⽤finally。如⽂件关闭,释放锁,把数据库连接返还给连接池等。
demo:

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
        #如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到
        #⽐如 按下了 ctrl+c
        pass
    finally:
        f.close()
        print('关闭⽂件')

except:
    print("没有这个⽂件")

说明:
        test.txt⽂件中每⼀⾏数据打印,但是我有意在每打印⼀⾏之前⽤time.sleep⽅法暂停2秒钟。这样做的原因是让程序运⾏得慢⼀些。在程序运⾏的时候,按Ctrl+c中断(取消)程序。
        可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执⾏,把⽂件关闭。

 


异常的传递

1. try嵌套中

import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
                time.sleep(2)
                print(content)
    finally:
            f.close()
            print('关闭⽂件')
except:
    print("没有这个⽂件")

运⾏结果:

^C关闭⽂件
没有这个⽂件

总结:

  • try嵌套时,如果⾥⾯的try没有捕获到这个异常,那么外⾯的try会接收到这个异常,然后进⾏处理。
  • 如果外边的try依然没有捕获到,那么再进⾏传递。。。


2. 函数嵌套调⽤中

def test1():
    print("----test1-1----")
    print(num)
    print("----test1-2----")

def test2():
    try:
        print("----test2-1----")
        test1()
        print("----test2-2----")

    except:
        print("test2出现异常")
        print("----test2-3----")
        test2()
        print("------华丽的分割线-----")

总结
        如果try嵌套,那么如果⾥⾯的try没有捕获到这个异常,那么外⾯的try会接收到这个异常,然后进⾏处理,如果外边的try依然没有捕获到,那么再进⾏传递。。。
        如果⼀个异常是在⼀个函数中产⽣的,例如函数A---->函数B---->函数C,⽽异常是在函数C中产⽣的,那么如果函数C中没有对这个异常进⾏处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理⽅式进⾏执⾏;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进⾏异常的默认处理,即通常到的那样。


抛出自定义的异常

可以⽤raise语句来引发⼀个异常。异常/错误对象必须有⼀个名字,且它们应是Error或Exception类的⼦类。
下⾯是⼀个引发异常的例⼦:

class ShortInputException(Exception):
'''⾃定义的异常类'''
    def __init__(self, length, atleast):
        #super().__init__()
        self.length = length
        self.atleast = atleast

    def main():
        try:
            s = input('请输⼊ --> ')
            if len(s) < 3:
                # raise引发⼀个你定义的异常
                raise ShortInputException(len(s), 3)
        except ShortInputException as result:    #x这个变量被绑定到了错误的实例
            print('ShortInputException: 输⼊的度是 %d,度⾄少应是 %d'% (result.length, result.atleast))
        else:
            print('没有异常发⽣.')

main()

 

Python更多:https://blog.csdn.net/Scrat_Kong/article/details/90257118

你可能感兴趣的:(Python)