AI智能
改变未来

python什么是异常?如何处理异常


异常处理

  • 什么是异常

    异常是程序错误发生的信号。程序一旦出现错误,就会产生一个异常,如果程序中没有处理该异常,该异常就会抛出来,程序的运行也随即终止。

错误分为两种

  • 1、语法错误

  • 2、逻辑错误

如何处理

  • 语法错误:这种错误在程序运行前就必须改正确

  • 逻辑错误:

    针对可以控制的逻辑错误,应该直接在代码层面解决

  • 针对不可以控制的逻辑错误,应该采用try…except…:一种异常产生之后的补救措施

可以控制的逻辑错误:

# 如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防age = input(\">>>: \").strip()if age.isdigit():age = int(age)if age > 19:print(\'too big\')elif age < 19:print(\'too small\')else:print(\'you got it\')else:print(\'必须输入数字\')

不可以控制的逻辑错误:

# 如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理# 如何用try...except\"\"\"print(\'start...\')try:被监测的代码块1被监测的代码块2被监测的代码块3被监测的代码块4被监测的代码块5except 异常的类型1 as e:处理异常的代码except 异常的类型2 as e:处理异常的代码except 异常的类型3 as e:处理异常的代码except (异常的类型4,异常的类型5,异常的类型6) as e:处理异常的代码except Exception:    # 万能异常,当上面所有的异常处理都对不上最终运行此异常处理处理异常的代码else:没有发生异常时要执行的代码finally:无论异常与否,都会执行该代码,通常用来进行回收资源的操作print(\'end...\')\"\"\"# 案例1print(\'start...\')try:print(111)print(222)l=[11,22,33]l[100]       # 异常:list index out of range 列表索引超出范围print(3333)except IndexError as e: # 捕捉异常匹配成功并打印e,程序不会崩print(e)print(\'end...\')# 案例2print(\'start...\')try:print(111)print(222)l=[11,22,33]l[100]print(3333)except KeyError as e:  # 异常对不上没有匹配成功,程序就崩了print(e)print(\'end...\')# 案例3print(\'start...\')try:print(111)print(222)l=[11,22,33]l[0]dic = {\'k1\':111}# dic[\'kkkkk\']print(3333)except Exception as e:  # 万能异常,什么异常都能对上print(e)else:  # try内代码块没有异常则执行print(\'else的代码\')finally:      #  无论异常与否,都会执行该模块,通常是进行清理工作print(\'====>finally的代码\')print(\'end...\')l=[]l[100]>>> IndexError: list index out of range # 列表索引超出范围dic={}dic[\"k1\"]>>> KeyError: \'k1\'class Foo:passobj = Foo()obj.x>>> AttributeError: \'Foo\' object has no attribute \'x\'  # Foo对象没有属性xint(\"asdb\")    # 无效的int()的基数为10:\'asdb\'>>> ValueError: invalid literal for int() with base 10: \'asdb\'1/0>>> ZeroDivisionError: division by zero # 零除法错误:被零除法def func(x):passfunc()        # func()缺少1个必需的位置参数:\'x\'>>> TypeError: func() missing 1 required positional argument: \'x\'x>>> NameError: name \'x\' is not defined   # 名字\'x\'没有定义print(\'asdfadf\'>>> SyntaxError: unexpected EOF while parsing  # 解析时意外的EOF:语法错误# 断言:判断条件达到标准,如果不达到标准就抛出异常(测试程序的时候可以用,测试完后应该删掉)l = [111,222]if len(l) != 3:    # 判断如果l长度不等于3  方式一raise Exception(\'必须达到三个值\')  # Exception: 必须达到三个值assert len(l)  == 3  # 断定l长度等于3  方式二,跟方式一效果一样print(\'后续代码。。。\')# raise  # 主动抛出异常,为别人定规则的时候就可以用到主动抛异常raise IndexError(\"索引错误\")  # IndexError: 索引错误# 自定义异常# 自定义一个权限相关的错误,继承一下内置的异常类型(BaseException:基本的异常)class Permission(BaseException):def __init__(self,msg): # 自定义的还可以加其他功能self.msg = msgraise Permission(\"权限错误\") # 自定义异常通常配合raise使用,自己抛出自定义的异常,提示效果更强# __main__.Permission: 权限错误

异常的种类

  • 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误
# 常见异常AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » python什么是异常?如何处理异常