Python_异常

本文详细介绍了Python异常的概念、抛出原因,展示了如何捕获和处理不同类型的异常,包括简单的异常捕获、根据错误类型捕获、未知错误处理,以及主动抛出异常的实战应用。通过实例演示,学习如何编写健壮的程序应对各种错误,确保程序稳定性。
摘要由CSDN通过智能技术生成

1.异常的概念以及抛出异常的原因

学习一个新的知识点, 叫做异常,先来明确一下什么叫做异常,然后呢,解释一下Python解释器在运行程序的时候为什么会抛出异常,

当编写完程序之后,最终要交给Python解释器去执行, Python解释器在执行程序的时候,如果遇到一个错误,Python解释器就会把当前正在执行的程序停止下来,并且在控制台输出一些错误信息. 这种把当前的程序停止下来, 然后提示错误的动作,就把它叫做抛出异常.

python的解释器之所以会抛出异常, 先看一下下面这张示意图,先看一下示意图的右侧产品,要根据不同的业务需求开发出一个又一个产品交付给用户, 假设交互给用户的产品在执行的时候会时不时的停止下来,并且提示给用户一些错误信息,这种产品不是好产品, 如果提交给用户这种产品, 用户显然是无法接受的,因为需要给用户提交一个既稳定又健壮的产品. 所谓健壮的产品啊, 就是功能非常的强大,而且运行起来非常的稳定,不会时不时的停止下来给用户报告一些错误信息,这样的产品才是好产品.

再看一下负责执行程序的Python解释器,根据不同的业务需求编写出不同的代码,只要这些代码是符合Python语法规则的, Python解释器就应该能够执行.

一个符合语法规则的Python代码, 在执行的时候会报错吗?

假设在开发的时候需要提示用户输入一个整数,如果要完成这个需求,应该先定一个整数的变量, 来接收一下用户的输入结果, 然后使用int 函数把用户输入的内容进行转换, 而要让用户输入, 就是input函数提示一下用户就行了,

就输一个数字10时,现在num这个变量中就保存了用户输入的10,

这句代码在运行的时候, 如果用户输入的不是一个整数,而是一个字母或者其他的内容,在执行的时候会报错,回车之后, python解释器抛出了一个异常,提示是一个值错误,然后提示使用int这个函数在转换内容的时候, 只支持针对十进制的数字进行转换,而没有办法把一个字母a转换成一个整数.

编写了一个符合Python语法规则的代码,但是在执行时也有可能出现错误, 因为没有办法决定用户在使用系统时,输入的到底是一个整数还是一个字母,在开发时这种情况必须要特殊的处理.

再看一下这张示意图,python的解释器接收到一个符合语法规则的代码就会执行,但是在执行过程中如果遇到错误,这个时候呢,python的解释器就会抛出一个异常.

这个异常啊,会抛给编写的代码, 注意, 这个异常并不是抛给最终用户的,而是抛给开发程序的程序员,当程序员接收到这个异常之后,就要针对这个异常有针对性的进行处理.

假设针对这个异常做了有针对性的处理之后,程序在运行时应该就不会停止下来了. 既然程序不会随随便便停止,就满足了终极目标,开发出一个既稳定又健壮的产品,交互给最终的用户.

这个就是抛出异常的原因. 因为在程序开发中啊,并不能把所有的特殊情况全部处理得面面俱到,这个时候呢程序在执行时, 可能会因为一些特殊的情况, 导致程序运行的异常, 那这个时候就可以针对这个异常啊, 做出针对性的处理.

 

只要做过处理之后,程序再次遇到这种情况时就不会停止下来,而会继续运行,这样呢就能够开发出一个既稳定又健壮的产品交互给用户了.

2. 简单的异常捕获

怎么样获取到Python解释器抛出的异常?程序在执行时, 一旦遇到错误就会抛出一个异常,而要获取到Python解释器抛出的异常,有一个非常专业的术语叫做捕获. 捕获异常就是获取到解释器抛出的异常,在Python中最简单的捕获异常的语法.

在开发时有一种情况,就是编写的代码是完全符合语法规则的,这些代码能否正常的执行并不能确定,如果在开发时遇到这种情况,就可以使用到捕获异常的语法了.

如果某些代码不能确认能否正常的执行,就在代码上方增加一个try关键字,try有尝试的意思, 来尝试一下这些代码能否正常的执行,如果能执行的就继续执行下方其他的代码. 那如果这些代码不能够正常执行,还需要在try关键字下方再增加一个except关键字,except有 如果不是 的意思,如果这些代出现了错误, 就会执行except下方针对错误处理的代码.

当这些针对错误处理的代码执行完成,程序并不会停止下来,而是会继续执行下方其他的代码,这个就是Python中捕获异常的语法.

做个演练,代码写完,

先来运行一下程序走,程序正常执行,

先输入一个整数10 , 程序能够正常执行,

如果运行程序输入一个字母呢,程序会报错. 现在就输入一个字母,

回车,程序报错了,

Python解释器抛出了一个异常,那现在就使用捕获异常的语法, 来处理这个代码. 如果在开发中某一些代码,没有办法确定能否正常的执行,那就在代码上方啊,先增加一个try 关键字,然后把不能确定的代码放在try 关键字下方,在这句代码末尾上提示需要增加一个except关键字,

 因为需要针对出现错误进行一个处理,那现在就增加一个except关键字,然后在except关键字下方使用print函数做个输出,请输入正确的整数,提示信息输入完成,

就是已经针对错误做了一个处理. 现在看清楚代码的执行线索啊,在下方在使用print函数做个输出,就直接输出一个分割线,看看出现错误以及不出现错误,这个分割线能不能被打印出来.

再执行一下程序,先来输入一个正确的整数,

输入数字10回车,输入之后, 下方的分割线能够被打印出来,

现在再执行程序, 输入一个错误的字母a,

回车,现在程序执行时会把提示信息  请输入正确的整数  输出来,同时分割线同样也被打印.

这个就是python中针对异常进行捕获的语法.

try:
    # 不能正确执行的代码
    num = int(input("请输入一个整数:"))
except:
    # 针对错误的处理代码
    print("请输入正确的整数:")

print("-" * 50)

3. 根据错误类型捕获异常

针对错误类型来捕获异常, 在开发时如果某些代码不能确定能否正常执行,就可以在代码上方增加一个try关键字,来尝试执行一下这些代码,然后呢在代码下方增加一个except关键字,在except关键字下方, 来编写错误处理的代码就可以,这个是最简单的捕获异常的代码.

但是在开发中还有一种情况, 就是要尝试执行的代码,在执行的时候, 可能出现错误的情况不止一种,同时呢,要针对不同类型的错误做出不同类型的响应,这个时候就需要针对错误类型来捕获异常了.

案例演练, 这个案例需求中要求第1步提示用户输入一个整数,然后呢使用数字8除以一下用户刚刚数的整数并且输出,

先做一个简单的代码准备,先来实现一下第1步,提示用户输入一个整数, 一个简单的代码写完,

 

第2步使用数字8来除以一下用户刚刚输入的num,除完之后要把计算的结果做一个输出,那现在就使用print函数把计算的结果做个输出,简单的三句代码写完,

就来运行一下程序,

现在如果输入一个数字10, 程序是能够正常执行的,现在回车,得到一个0.8,

这三句代码有可能出现的错误,输入一个字母a就会错误了,因为int函数在转换时, 只能转换整数字符串而不能转换字母, 会出现值错误的异常.除了值错误的异常,现在完成的代码在执行时还有可能会出现的错误,在做除法的时候分母不能为零.

现在运行一下程序,这一次输入一个零,

回车,

输入一个零, 回车之后,Python解释器抛出了一个除以0 错误的异常,因为在做除法的时候0不能作为分母.

简单的三行代码, 在执行的时候有两种错误的可能,那么在开发时,应该针对两种错误类型分别给用户不同的提示,输入的不是整数,应该有对应的提示,输入一个0, 应该有另外一个提示.如果在开发中啊,希望针对不同类型的错误给用户不同的响应,那么就需要针对错误类型来捕获异常了.要针对错误类型捕获异常,只需要在except关键字后面跟上错误类型,然后在下方针对这种类型的错误,有针对性的来编写处理的代码.

如果希望捕获多种类型,就可以继续使用except关键字, 来捕获其他类型的错误,然后针对这些类型的错误来有针对性的编写相应的处理代码就可以.

错误类型应该怎么获取呀,当Python解释器抛出异常之后,在最后一行错误信息的第1个单词就是要捕获的错误类型.

输入一个数字0,python解释器抛出了一个异常,而最后一行错误信息的第1个单词是除零错误, 这个错误呢,就是要捕获的准确错误类型.

现在选中这个单词,复制一下,然后呢,把光标放在现在的代码上,如果这些代码不能确定在执行时能够正常执行,就可以使用try这个关键字,然后把下方所有的代码选中按一下,来统一尝试执行这三行代码,现在把光标放在第9行来输入一个except,可以把出错信息的最后一行第1个单词放在except关键字的后面. 在except下方使用print函数做个输出,除零错误,这样针对除0错误, 就单独有一个具体的提示,

现在再运行一下程序,输入零,

回车,

这一次的解释器就不会抛出异常了,因为针对异常已经做了特殊的处理.

如果现在运行程序,输入一个字母a, Python解释器又抛出了异常. 如果需要针对这种错误也进行处理,只需要在下方啊再增加一个except关键字, 在except后面,把ValueError这个单词选中,CTRL c,然后呢,把光标放在except后面CTRL v粘贴进来,现在就使用print的函数做个输出,请输入正确的整数,输出完成, 再来运行一下程序,

再输入一个字母,

请输入正确的整数,

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))
    
    # 使用8 除以用户输入的整数并且输出
    result = 8 / num
    
    print(result)
except ZeroDivisionError:
    print("除0错误")
except ValueError:
    print("请输入正确的整数")


 

4. 捕获未知错误

怎么样来捕获未知错误,所谓未知错误啊,就是在开发时没有提前预判到的错误类型,就叫做未知错误.

在开发时如果能够提前预判到所有的错误类型,就可以根据不同的错误类型作出不同的响应,这一点呢还是非常方便的,但是在开发一个复杂程序时,想要把所有可能出现的错误,提前全部预判到,还是相当有难度的,但是呢,最终交付给用户的产品,不能因为没有提前预判到某一种错误类型,这个产品在运行的时候,因为Python的解释器突然抛出一个异常,被强行终止了,所以啊,要学习一下怎么样来捕获未知错误,也就是把没有提前预判到的错误,同样也能捕获到.

看一下语法,在python中啊,想要捕获未知错误的语法非常的固定,在expect这个关键字后面跟上一个exception,这个exception是Python中针对异常提供的类,然后呢,在后面跟上一个as的关键字,再跟上一个result,result是在except下方使用的一个变量名, 这个变量名啊,可以随便写,通过这个result就可以访问到被捕获到的未知异常,同时呢,可以使用print函数,把具体的错误信息输出在控制台,同时呢,不会因为未知错误这个异常导致程序的崩溃,这个就是捕获未知错误的语法.

如果我们在开发时没有提前预判到除0错误,意味着编写的代码并不会针对这个错误做任何的处理,就把除零错误的异常处理删除掉,现在这个程序在执行时只有当用户输入0的时候才会抛出异常, 现在运行一下,

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
# except ZeroDivisionError:
#     print("除0错误")
except ValueError:
    print("请输入正确的整数")

先输入一个数字8,回车程序正常,

如果执行程序时输入一个字母呢,同样也能够进行异常处理,

只有当用户输入0的时候才会抛出异常,

假设在开发时没有预判到这种错误,但是呢,又想保证程序安全稳定的运行,这个时候就可以在之前的错误类型下方再来增加一个except关键字, 然后呢,写一个except找到exception,这个异常类回车,然后呢,写上as result, 这个result变量啊,这是在except下方, 可以输出的异常对象,现在再把捕获的异常对象result做个输出,现在再运行一下程序,

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
# except ZeroDivisionError:
#     print("除0错误")
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

这次就直接输入一个数字0,回车,

现在控制台输出未知错误,具体的原因呢, 就是除以了0.

5. 异常捕获的完整语法

Python中异常捕获的完整语法,在开发时,如果某些代码不能够确定能否正常的执行,就在这一些代码上方增加一个try,来试一试执行,然后呢使用except关键字, 针对不同的错误类型作出不同的错误处理.

一种错误类型,又一种错误类型,又一种错误类型,当所有可以预判的错误类型处理之后, 不要忘记哦,还需要额外的增加一个未知错误的捕获,在开发的时候很难预判到所有的错误类型.

关于异常捕获的完整语法,只有两个关键字没有介绍, 一个else,一个finally,那现在就来明确一下else下方的代码, 以及finally下方的代码在什么时候会被执行,当尝试执行的代码正常执行完成,没有出现任何错误的时候,就会来到else下方来执行else下方的代码.

用大白话来讲,只要尝试成功就会执行else下方的代码,而finally下方的代码呢, 是无论是否出现错误都会被执行的代码.

用箭头的方式描述一下,现在这张语法图中, 执行程序的时候出现异常和不出现异常程序执行的线路.

先来看一下正常的执行,假如要尝试执行的代码正常执行完成,正常执行完成,就是不会执行except下方的代码, 当这部分代码执行完成之后会直接来到else,else下方的代码是没有异常时会被执行的代码, 当else下方的代码执行完成之后,还会执行finally下方的代码,因为finally下方的代码无论是否出现异常都会被执行,当这部分代码执行完成之后,就会继续执行后续的代码, 这个是程序正常执行的执行线路,

再来看一下出现异常时执行的线路,当尝试执行某些代码的时候,一旦出现错误就会跳到对应的错误类型去执行对应的代码,当这部分代码执行完成之后,不会执行else下方的代码, 因为else下方的代码是没有异常时才会被执行的, 当错误执行的代码执行完成之后, 就会来到finally,finally下方的代码无论是否有异常都会被执行,当finally代码执行完成之后就会继续执行后续的代码,这个就是正常执行以及出现异常时程序的执行线路,

右边的是正常执行的线路, 左边的是出现异常执行的线路,那现在就演练一下,

先在except下方来增加一个else关键字,在关键字下方我们先使用pass做个占位,然后呢再增加一个finally关键字,同样使用pass做个站位,现在一个完整语法写完了.

else下方的代码是在尝试执行的代码正确执行,没有出现错误时才会被执行的代码,写一个尝试成功,else下方代码改造完成, 再把光标放在finally,finally下方的代码无论是否出现错误都会被执行写一下,无论是否出现错误都会执行的代码,这个就是finally下方的代码.

再把光标放在18行,来使用print函数来输出一个分割线,当异常捕获的代码执行完成,分割线会被打印.

代码改造完成, 就来运行一下程序,

先输入一个数字1, 数字1会正常执行, 回车,回车之后, 首先在控制台输出做了一个除法之后的结果8.0,然后会直接跳到else,把 尝试成功 做一个输出, 输出之后不要忘记,无论成功与否都会执行finally下方的代码,finally下方的代码执行完成之后,会把分割线做一个输出,这个就是尝试成功执行的线路.

 再运行一下,看看当出现异常时程序是怎样执行的, 输入一个数字0,让它出现除0错误,回车,回车之后直接来到了除0, 显示的除0错误,同时出现异常之后就不会执行else下方的代码了, 会直接跳到finally, 再执行finally下方的代码,因为finally下方的代码无论是否出现错误都会被执行,紧接着看finally下方的代码执行完成之后, 还会输出分隔线,因为啊完整的异常代码就是从try开始到finally结束,无论是否出现异常,当这个完整的代码块执行完成之后, 都会继续顺利的执行后续的代码,这个就是完整的捕获异常代码.

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ZeroDivisionError:
    print("除0错误")
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功")
finally:
    print("无论是否出现错误都会执行的代码")

print("-" * 50)


 

6. 异常的传递性

异常的传递,所谓异常上的传递啊,就是当某一个方法或者函数在执行的时候出现了错误,出现错误会抛出异常. 抛出异常的一瞬间,程序并不会被立即终止,而会把这个异常传递给函数或者方法的调用一方.

那程序什么时候才会被终止呢?当这个异常,被传递到主程序之后,如果仍然没有找到异常的处理,这个时候程序才会被终止,这个就叫做异常的传递.

 

怎么样来验证异常的传递呢?先定义一个demo1的函数, 在函数内部提示用户输一个整数并且返回,然后呢,在主程序中调用一下这个函数,通过程序的执行来观察一下异常的传递.

首先使用def 来定义一个demo1这个函数,然后使用return关键字,把用户输入的整数做个返回,一个简单的函数定义完成,

 

就在主程序中,使用print 函数把demo1 的执行结果做个输出,

 

现在运行程序走,现在控制台提示输入整数,

 

就输入一个整数1, 回车,程序正常.现在输入一个字母a, 回车, 程序报错了,抛出的异常是一个值错误,提示int函数无法转换字母a,

 

那现在看一下上面的错误信息,真正出错的代码是第2行,也就是第2行再转换整数的时候出现了问题,但是注意第2行代码出现问题的时候会把异常交给第5行代码,第5行代码在调用demo1这个函数,把一个异常交到了主程序,而主程序中并没有做异常处理. 既然主程序中没有做异常处理,所以这个时候程序才会被终止,这个就是异常的传递。

 

现在把这个程序再做一个扩展,现在使用def关键词,再来定一个demo2的函数,在demo2 内部,直接返回一下demo1 函数的执行结果, 函数调函数,现在呢,就在主程序中来调用一下demo2这个函数,代码改造完成,

 

再来运行一下程序,现在就直接输入一个字母a,

 

回车, 程序又报错了, 

现在出错的代码仍然是第2行整数转换时出现的错误, 现在把控制台的信息向上滚动,

 

当第2行代码出现错误之后,会把异常交给第6行代码,第6行代码是在demo2函数内部, 来调用的demo1,当异常被传递到demo2之后,在demo2 函数内部没有针对异常进行处理,既然没有处理异常, 就会把这个异常继续向上传递, 传递到代码的第9行, 第9行在主程序中调用了一下demo2 这个函数, 这个就是异常一级一级传递的过程,在程序执行时,如果某一个函数出现了异常,会把这个异常向上传递, 传递给函数的调用一方, 一直传递到主程序之后,如果没有发现异常处理, 程序才会被终止.

异常的传递在开发中有什么用处呢?在上一小节,为了实现一个输入整数,同时做一个简单的除法,做了一大堆的异常处理. 那现在来看一下异常的传递这个代码,在开发中为了保证每一个函数的正常执行,在开发的时候在每个函数内部都增加大量的捕获异常的代码.

如果每个函数内部都需要增加捕获异常的代码,在开发的时候就太辛苦了,为了能够减轻的工作量, 可以在主程序中利用异常的传递性,出现异常之后会从函数内部一层一层的传递到主程序.

可以在主程序中利用异常的传递性在主程序捕获异常,把捕获异常的代码放在主程序中,代码改造完成了,

 

再来运行一下程序,还是直接输入一个字母a,

 

看一下主程序中的捕获异常,能不能把函数内部的异常捕获到来,回车, 回车之后控制台输出了位置错误,

 

非法的转换,

利用了异常的传递性,只需要在主程序中针对异常做一个捕获,就不需要在每一个函数中增加捕获异常的代码了, 体会一下利用异常的传递性, 在开发程序的时候好处非常明显,在编写每一个函数的时候,可以把注意力放在函数的代码逻辑实现上,而不需要花费太多的心思来考虑异常的捕获.

当所有的函数开发完成,可以在主程序中针对具体的错误类型进行异常的捕获,这样呢就可以保证在开发每一个函数的时候都是轻松的.

在主程序中增加了异常捕获之后, 会使得开发完成的代码在运行的时候既稳定又健壮. 

def demo1():
    return int(input("输入整数:"))

def demo2():
    return demo1()

# 利用异常的传递性, 在主程序中捕获异常
try:
    print(demo2())
except Exception as result:
    print("未知错误 %s" % result)


 

7. 主动抛出异常的应用场景

怎么样在开发的程序中主动的来抛出一个异常?

当的代码在执行的时候,一旦出现错误, Python解释器啊会主动的抛出异常,而可以通过捕获异常, 根据具体的错误类型作出针对性的处理.

自己开发的应用程序能不能来主动的抛出一个异常呢?在开发时什么时候需要主动的抛出异常呢?为了更好的理解,看一下下面这张示意图,假设要开发一个用户登录模块,同时呢,在用户登录模块中,要封装一个输入密码的函数. 这个函数啊,就是专门用来提示用户输入密码,既然要输入密码,应该有个密码的规则,

那么就假定啊,要开发的应用程序密码规则呢,是长度不能少于8,一旦长度少于8,就认为是一个异常.

这个密码规则明确之后,再来看一下输入密码的函数,如果用户输入的密码长度大于等于8,就让这个函数把用户输入的密码直接返回给用户登录模块.

那如果用户输入的密码长度少于8,认为少于8是不正常的,那么就让输入密码这个函数抛出一个密码长度不够的异常.

把密码长度不够认为是一个异常,这个异常是针对应用程序特有的业务需求来定义的异常,当满足密码规则就返回用户输入密码,不满足密码规则就抛出不满足密码规则的异常.

 

8. 主动抛出异常案例演练

接下来就使用主动抛出异常,把输入密码这个函数实现一下,在开发时怎么样来主动的抛出一个异常,

 

要想主动抛出异常,只需要做两件事情,第1步呢,先使用Exception这个类来创建一个异常对象,Exception这个类啊,是Python中专门针对异常提供的类,既然是一个类,就可以使用类来创建一个对象,当对象创建完成,就可以使用raise这个关键字,把创建好的异常对象做一个抛出,要想主动抛出异常,只需要做两件事情,第1步创建异常对象, 第2步抛出异常对象.

当抛出了异常对象之后,在调用函数一方就可以捕获到这个异常了.

案例需求,

 

需要定一个input_password函数,这个函数呢,来提示用户输入密码,同时要针对用户输入的密码判断一下长度,当然如果长度小于8, 就抛出异常,而如果长度大于等于8,就符合密码规则,那么就让函数把用户输入的密码做一个返回.

首先使用def关键字, 来定义一个input_password的函数, 函数名准备完成,

 

先以注释的方式来明确一下函数需要做的三件事情,第1步需要提示用户输入密码,当用户输入完密码之后,需要判断密码长度,如果密码长度大于等于8,符合密码规则,那么就返回用户输入的密码,既然符合规则,就把用户的密码直接做一个返回. 那如果小于8,就要主动抛出异常.

三个步骤写完,

就逐一实现一下代码,第1步要提示用户输入密码,

提示输入完成,需要针对用户输入的密码判断一下长度, 要判断字符串的长度, 应该使用内置的函数len(),把password这个变量传递进来,如果大于等于8的条件成立,要返回一下用户输入的密码.那既然要返回,就使用return这个关键字把用户的密码做一个返回. 

 

返回之后, 再来看第3步,当代码执行到这里, 密码的长度一定是小于8,既然是小于8,就需要主动抛出异常,先使用print函数,简单的做个输出,主动抛出异常, 输出完成,主动抛出异常的代码,稍后再写.

 

现在一个基础的输入密码的功能已经实现,就可以在主程序中提示用户输入密码,那现在就使用print函数做个输出,在print函数内部, 再来调用一下输入密码这个函数,

 

当输入密码函数执行完成,会把函数的返回结果通过print函数输出在控制台, 现在就运行一下程序,先来检查一下输入密码这个函数能不能正常执行, 现在控制台提示输入密码,

 

输入一个12345678,回车,

 

回车之后会把用户输入的密码直接输出在控制台,那现在再运行一下程序,输入一个短一点的密码,这一次就输入一个字母a, 回车,

 

回车之后, 控制台输出了主动抛出异常,并且输出了一个None.

为什么会输出一个None,因为 input_password()函数并没有做任何的返回,没有任何的返回,在使用print进行输出的时候, 就在控制台输出出一个空对象None, 代码演练到这里,一个基本的输入密码的函数已经准备完成.

 

那接下来就应该到主动抛出异常了, 在开发程序的时候,如果想要主动抛出异常只需要做两件事情,第1件事情使用Exception类创建一个异常对象,第2件事情使用raise关键字,把创建出来的异常对象做个抛出.

再增加两个注释, 第1步, 应该创建异常对象,当创建完异常对象之后,应该主动抛出异常,两个步骤写完.

 

先给异常变量起个名字叫做ex,然后呢,使用Exception这个类来创建一个异常对象,要创建对象可以使用一个小括号,敲小括号的时候,给一个智能提示,

 

*args, *args是一个多值得元组参数,而在创建异常对象的时候,可以传递一下异常的描述信息,也就是出错信息,

 

现在创建异常对象,并且指定了一下错误信息,然后就可以主动的抛出这个异常,要抛出异常啊,就使用raise这个关键字,然后呢,在关键字后面跟上异常对象就可以,

 

主动抛出异常的代码完成,现在再运行一下程序,现在就直接输入一个字母a,

 

回车,现在程序执行已经出错了,出错的代码是第16行,

 

 

来看一下第16行,第16行在抛出异常对象,然后再继续向上看,当第16行抛出异常之后, 利用异常的传递性,会把异常传递给第20行代码,

 

那现在来看一下第20行代码的内容,第20行代码在调用输入密码这个函数, 这个是异常的传递性

既然抛出了一个异常,就可以捕获异常, 那要捕获异常应该用try关键字,然后呢,把输入密码这个函数移动到try关键字下方,并且在下方在使用except来捕获一下异常,

 

捕获异常的代码基本准备完成,就在except下方使用print函数来输出一下错误信息,就把result对象做一个输出,

 

现在捕获异常的代码写完, 再来运行一下程序,

输入一个字母a,

 

回车,

 这次程序在运行时控制台已经输出了,密码长度不够,密码长度不够就是在创建异常对象时指定的异常错误信息,

 

在创建异常对象时,可以使用错误信息字符串作为参数.

使用这个字符串作为参数之后,那么在调用函数一方捕获异常的时候, 直接输出,就可以把创建异常对象指令的描述信息,

 

直接输出到控制台,这个就是主动抛出异常的代码,一句话讲要想主动抛出异常,先来创建一个异常对象,然后使用raise关键字, 把这个异常对象做一个抛出,抛出之后在调用函数一方就可以捕获到这个异常了.

def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度 >=8, 返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 如果 < 8 就主动抛出异常
    print("主动抛出异常")
    # 1) 创建异常对象 - 可以使用错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2) 主动抛出异常
    raise ex

# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    print(result)

​​​​​​​
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值