python exercise exception

版权声明:本文章为博主原创文章,未经博主允许不得转载,如有问题,欢迎留言交流指正 https://blog.csdn.net/finalkof1983/article/details/88841732

python异常的一些说明

#python异常语法全家桶
try:
    suite1
    suite2
    suite3
except IOError:
    suite for IOError exception
except ValueError as valueErr:
    suite for ValueError exception and get ValueError info with valueErr argument
except (IOError,ValueError,TypeError):
    suite for (IOError,ValueError,TypeError) exception
except Exception:
    suite for all Exception
else:
    suite when no exception exec
finally:
    always_exec_suite

python异常处理组件为  try--except--else--finally,其中else和finally是可选的,try和except是必选的,异常处理语句中至少要包含一个except

异常处理执行的流程为:


异常的示例

def testexception():
    try:
        with open(r'F:\pythonfiletest\testxxx','r') as test:
            test.read()
    except IOError as IOErr:
        print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , IOErr)
    else:
        print("这是else,当不发生异常时,我会执行")
    finally:
        print("这是finally,无论是否发生异常,我都会执行")

    print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")

testexception()


#输出
这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行
[Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行

首先尝试打开文件读取内容,testxxx文件并不存在,所以会产生一个IO异常。except声明捕获IO异常,打印定义好的内容,并且将系统产生的IOError错误信息一并打印。由于except语句执行了,所以else会被跳过。执行finally语句块。由于程序是”正常“结束的,所以最后的print语句也会被执行。


def testexception():
    try:
        with open(r'F:\pythonfiletest\testxxx','w+') as test:
            test.read()
    except ValueError as ValueErr:
        print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
    else:
        print("这是else,当不发生异常时,我会执行")
    finally:
        print("这是finally,无论是否发生异常,我都会执行")

    print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")

testexception()


#输出
这是else,当不发生异常时,我会执行
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行

调整一下语句,在不发生异常的情况下,else会被执行


def testexception():
    try:
        with open(r'F:\pythonfiletest\testxxx','r') as test:
            test.read()
    except ValueError as ValueErr:
        print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
    else:
        print("这是else,当不发生异常时,我会执行")
    finally:
        print("这是finally,无论是否发生异常,我都会执行")

    print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")

testexception()


#输出
这是finally,无论是否发生异常,我都会执行
Traceback (most recent call last):
  File "F:/PythonProject/my_project/geektime/test.py", line 14, in <module>
    testexception()
  File "F:/PythonProject/my_project/geektime/test.py", line 3, in testexception
    with open(r'F:\pythonfiletest\testxxx','r') as test:
FileNotFoundError: [Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'

在未进行异常处理或者没有捕获到异常时,如果程序异常则直接抛出异常并退出,用户体验就很差了。由于产生的是IOError,而声明中捕获的是ValueError,不匹配。所以except语句块没有被执行。产生了异常,else语句块没有被执行。finally总要被执行。由于异常中断了程序,最后的print语句也没有被执行。没有被捕获的异常的错误信息被抛出。


def testexception():
    try:
        with open(r'F:\pythonfiletest\testxxx','r') as test:
            test.read()
    except ValueError as ValueErr:
        print("这是except,当发生异常并且和我声明捕获异常类型一致时,我会执行\n" , ValueErr)
    except Exception as AllErr:
        print("这是异常大管家,我捕获所有异常,如果发生异常且未被前面的except捕获,我会执行\n", AllErr)
    else:
        print("这是else,当不发生异常时,我会执行")
    finally:
        print("这是finally,无论是否发生异常,我都会执行")

    print("这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行")

testexception()


#输出
这是异常大管家,我捕获所有异常,如果发生异常且未被前面的except捕获,我会执行
 [Errno 2] No such file or directory: 'F:\\pythonfiletest\\testxxx'
这是finally,无论是否发生异常,我都会执行
这是函数最后的语句,如果产生异常且未被捕获时,程序中断,我不会执行

当然在捕获异常时,可以声明多个except语句或者在一个except语句中捕获多种异常,还可以使用Exception进行”兜底“,保证程序的正常执行。


def test(x):
    try:
        if type(x) is not int:
            raise TypeError('这是我主动抛出的异常')
        print(1+x)
    except TypeError as TypeErr:
        print("需要一个整数进行计算", TypeErr)


test(1.1)


#输出
需要一个整数进行计算 这是我主动抛出的异常

上面的示例都系统自动抛出异常,而raise允许主动抛出异常,例如该方法需要用户输入一个整数进行加法运算,如果用户输入一个浮点值用于做加法系统并不会抛出异常,会正常进行计算,但其结果已经不是我们想要的了,所以使用raise主动抛出异常,跳过try块中raise后面的语句,直接调用except返回错误提示信息。

猜你喜欢

转载自blog.csdn.net/finalkof1983/article/details/88841732