Python24_异常处理

try……except……else

print(3/0) #报错,程序停止执行

需求:当程序遇到问题时不让程序结束,而越过错误继续向下执行

try……except……else

格式:
try:
语句t
except 错误码 as e: #对于能够补救的错误,用except捕捉,如果不能补救,则不捕捉
语句1
except 错误码 as e:
语句2
……
except 错误码 as e:
语句n
else:
语句e

注意:else语句可有可无

作用:用来检测try语句块中的错误,从而让except处的语句捕获错误信息并处理

逻辑:当程序执行到try-except-else语句时

  1. 如果try“语句t”执行出现错误,会匹配第一个错误码,如果匹配上就执行对应“语句”

  2. 如果try“语句t”执行出现错误,但是没有匹配的异常,错误会被提交到上一层的try语句。或者到程序的最上层(try语句的嵌套)

  3. 如果try“语句t”执行没有出现错误,执行else下的“语句e”(前提,有else语句),个人理解,else与Except并列,如果出现了异常,执行Except中的语句,否则执行else中的语句

try:
    print(3/0)
except ZeroDivisionError as e:  #执行了该处错误
    print("除数为0了")
except NameError as e:
    print("没有该变量")
else:
    print("代码没有问题")
print("*"*8)

ps:错误码不用记

ps:一般代码出现错误了,直接使用except而不使用任何的错误类型

try:
    print(4/0)
except: #不管出现了什么错误,都会执行此处代码
    print("程序出现异常了")

使用except带着多种异常

try:
    pass
except (NameError, ZeroDivisionError):	#要捕获多个异常时,使用元组。
    print("出现了NameError或ZeroDivisionError")

ps:以上3种为常用的模式

try……except特殊的地方

  1. 错误其实就是class(类)(同java),所有的错误都继承自BaseException,所以在捕获的时候,它捕获了该类型的错误,还把子类一网打尽
try:
    print(5/0)
except BaseException as e:  #因为BaseException是所有错误类的基类,所以此处会捕获所有的异常,从而下面的捕获异常的语句不会执行。也可以直接使用Exception
    print("异常1")
except ZeroDivisionError as e:
    print("异常2")

  1. 跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,只要main捕获了错误就可以进行处理
def func(num):
    print(1/num)
    
def func2(num):
    func1(num)

def main():
    func2(0)

try:
    main()
except ZeroDivisionError as e:
	print(e)	#此处可以打印出错误信息

try……except……finally

格式:
try:
语句t
except 错误码 as e:
语句1
except 错误码 as e:
语句2
……
except 错误码 as e:
语句n
finally:
语句f

作用:语句t无论是否有错误,都将执行最后的语句f(常用于关闭文件)

try:
    print(1/0)
except ZeroDivisionError as e:
    print("出错了")
else:
	print("程序无异常")
finally:    #如果try里面有错误,执行finally后程序停止执行,否则执行后不停止程序
    print("必须执行我")

自定义异常

class ShortInputException(BaseException):
    """
    自定义的异常类
    """
    def __init__(self, len, atleast_len):	#自定义异常时重写了init方法,也可以不重写,那样可以直接给自定义异常传字符串参数,然后print该自定义异常时,会打印出参数字符串
        self.length = len
        self.atleast_len = atleast_len


def main():
    try:
        str = input("请输入您想要输入的信息:")
        if len(str) < 5:
            raise ShortInputException(len(str),5)
    except ShortInputException as sip:
        print("您输入的长度过短:%d,最短要求:%d"%(sip.length, sip.atleast_len))
    else:
        print("输入正确")

main()

异常的传递

异常发生后,会传递给函数(方法)的调用者A,如果A有捕捉到该异常(try……except……),则会按捕捉机制处理。如果A没有捕捉该异常,则会层层向上传递,最后会传递到python解析器。此处就简单地终止程序。

def fun1():
    print(1 / 0)


def fun2():
    try:
        fun1()
    except ZeroDivisionError as zero:
        print(zero)

fun2()

输出结果:
输出结果

手动抛出异常

def fun1():
	print(2/1)
	raise ZeroDivisionError

try:
	fun1()
except ZeroDivisionError as zero:
	print(zero)

翻外:python中的真假判断

数字:0表示假,非0表示真
[]、{}、()、""、False、None:空的列表、字典、字符串、False、空类型都为假
其他均为真,eg:“a”、3

翻外:BaseException和Exception

BaseException: 包含所有built-in exceptions

Exception: 不包含所有的built-in exceptions,只包含built-in, non-system-exiting exceptions,像SystemExit类型的exception就不包含在里面。

程序中异常发生了怎么办?

  1. 是否是可控的?
    1. 不可控的话,不管。
    2. 可控的异常,进行处理,如果不能处理,就raise出去
      2.不管可不可控,都先记录一下

个人目前感想:对于异常,就目前水平而言,可以结合文件读写以生成log

猜你喜欢

转载自blog.csdn.net/qq_34873298/article/details/89685040