Python中的异常模块

参考了《Python3从入门到实战》这本书

Python中的异常模块

一、基本框架

@注:编写程序的时候,如果知道某段代码可能会引起异常,而又不希望程序以堆栈跟踪的方式终止,就需要编写异常处理的程序代码。
@可以通过try/except或者try/finally语句(或者他们的组合)对出现的异常进行处理,如果异常得到了处理,那么程序就可以进行下去
#模式:
try...except...
try...except...else
try...except...else...finally
try...except...except...else...finally
try...finally
@基本形式是:try…except 程序块,将可能引起异常的代码放在try子句(程序块)中,如果try子句完成后没有异常发生,就会忽略except程序块(也称except子句)继续执行后面代码。如果try子句中代码执行时出现了错误而抛出异常,except程序块(子句)会处理出现的异常,一旦异常被except子句处理完,程序就会从try…except语句后面继续执行下去。
	try:
        x = int(input('Enter x '))#输入数并进行强制类型转换
        y = int(input('Enter y '))
        print(x/y)#除数不能为0
        print('x/y结果正常')
    except:
        print("出现了异常!")
    运行结果如下:
    Enter x 0

	Enter y 1
	0.0
	x/y结果正常
	----------------------(再运行一次)------------------------------------
	Enter x 1

	Enter y 0
	出现了异常!

二、捕获特定的异常

except子句可以捕获try块里面抛出的任何类型的异常。有时,可能需要根据不同类型的异常做不同处理,即在except关键字后面说明具体的异常名字。可以用as给这个类型的异常对象起一个名字。
	try:
        x = int(input("输入x"))
        y = int(input("输入y"))
        print(x/y)
        print('x/y结果正常')
    except ZeroDivisionError as e:#关于这个异常的名字可以通过解释器终止程序执行
        print("除数不能为0!!!!!!")#的时候看一看是由于什么异常导致的。
    except ValueError as e:
        print("输入类型错误!!!!!")
	
	运行结果如下:
	输入x1

	输入y0
	除数不能为0!!!!!!
	----------------------------(再运行一次)----------------------------
	
	输入xasd
	输入类型错误!!!!!

三、异常捕获的顺序

@当try子句抛出一个异常时,就根据该异常的类型按照从上到下的次序寻找匹配的异常处理子句。因此特殊的异常应该在前面,更一般的异常要放在后面。因为如果更一般的异常先被处理后,后面的特殊异常就不会被处理了。
@捕获位置的内置异常:最后一个except子句捕获BaseException类型的异常,就能够捕获所有的异常了。由于Exception是大部分异常的父类,通常情况下也可以用Exception代替BaseException。
@可以在最后的except子句的后面加一个else子句,当没有异常发生时,会自动执行else子句,但如果发生了异常,就不会执行。
	try:
        x = int(input("输入x"))
        y = int(input("输入y"))
        print(x/y)
        print('x/y结果正常')
    except ZeroDivisionError as e:
        print("除数不能为0!!!!!!")
    except Exception as e:
        print("我也不知道是什么错误!!!!!")
    else:
        print("没有任何异常")
    运行结果如下:
	输入xqwewq 
	我也不知道是什么错误!!!!!
	输入x1       #注意这里我没有打空格,是输入x=1,y=2。

	输入y2
	0.5
	x/y结果正常
	没有任何异常

四、finally子句

@无论有没有异常出现都将会被执行,如果出现了异常,但还没有处理,则当finally中的所有代码都执行完毕后,会继续向上一层的调用函数抛出这个异常,直到这个这个异常在某一层得到了处理,程序才会继续执行下去,或者一直没有处理这个异常,程序就会终止
	#写了三个try语句 帮助理解
	try:
        x = 1/1
        print(x)
    finally:
        print("永远执行:")
        
    print   ("-"*60)#分隔
    
    try:
        x = 1/0
        print(x)
    except Exception as e:
        print("除数不能为0")#错误能被处理,后执行了finally语句
    finally:
        print("永远执行:")
        
    print   ("-"*60)#分隔
    
    try:
        x = 1/0
        print(x)
    finally:
        print("永远执行:")#先执行了finally语句
    
    运行结果如下:
    1.0
	永远执行:
	------------------------------------------------------------
	除数不能为0
	永远执行:
	------------------------------------------------------------
	永远执行:
	Traceback (most recent call last):
	
	  File "E:\软件人\pkg02\数据分析.py", line 28, in <module>
	    x = 1/0
	
	ZeroDivisionError: division by zero
@finally子句主要用于做一些清理工作,如释放外部资源,(文件或网络连接),无论他们在使用过程中是否出错

五、抛出异常

@用raise抛出异常:python解释器在运行时可以自动抛出异常,程序猿可以在任何代码处用raise抛出异常
	try:
        score = float(input('输入分数:'))#强制类型转换
        if score < 0:
            raise ValueError("输入错误!!!")#抛出异常
    except ValueError as e:#捕获异常
        print(e)
    运行结果如下:
    输入分数:-1
	输入错误!!!

六、自定义异常

@测试自己定义的异常类
	class MyError(Exception):#继承Exception
        def __init__(self,value):
            self.value = value
            
    try:
        raise MyError("我自己定义的异常")
    except MyError as e:
        print(e)#打印出参数value的值
        
    运行结果如下:
	我自己定义的异常

自定义异常一般包含以下内容:
1.自定义异常的代码
2.自定义异常的问题提示
3.自定义发生异常的行数

七、断言

@使用断言(assert)来检查某个条件或结果,断言用于判断一个表达式的值是否为True,如果断言失败,则assert语句本身就会抛出AssertionError。还可以在断言的后面用逗号跟一个表达式,如果断言失败,则输出这个表达式的值
@python解释器执行一个程序时,设置-o选项关闭调试模式,以优化模式执行程序.
	try:
        assert(1+1 == 2)
        assert(1+1 == 3),'1+1 == 3不成立'
    except AssertionError as e:#捕获信息
        print(e)

    print("-"*60)
    
    assert(1+1 == 2)
    assert(1+1 == 3),'1+1 == 3不成立'
    运行结果如下:
   	1+1 == 3不成立#这是一开始用except捕获的结果
	------------------------------------------------------------
	Traceback (most recent call last):
	
	  File "E:\软件人\pkg02\数据分析.py", line 18, in <module>
	    assert(1+1 == 3),'1+1 == 3不成立'
	
	AssertionError: 1+1 == 3不成立

总结:异常模块在程序中还是经常使用的,有的时候,我们不知道代码在哪里可能会出现异常,万一没有捕获的话,有可能会造成一定损失,而异常模块就减小甚至避免了这些损失。

猜你喜欢

转载自blog.csdn.net/qq_45911278/article/details/111662037