好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

python12_异常处理

错误:语法错误(大小写拼写错误、括号不匹配等...)=> 不能正常执行 逻辑错误(程序运行正常,只是最后结果不符合预期) 异常:程序运行过程中,出现的意料之外的错误(如:打开的文件不存在、被除数为0、操作的数据类型不对、存储错误,互联网请求错 误等)

常见异常类:

1)NameError:没有定义 print(a) 2)ZeroDivisionError:除数为0 a = 1/0 3)IndexError:超出索引序列范围

           a = [1,2,3]
          print(a[4]) 

4)KeyError:请求一个不存在的字典关键字

           a = {"key1":"123","key2":"456"}
          print(a["key3"])
          print(a.get("key3","test"))-----#建议用这个取值,不会报错 

5)AttributeError访问对象未知属性

           import math
          math.xxx(4) 

6)ValueError传给函数的参数类型不正确 int("abc")-----#这是给int传入了字符串

异常处理机制:try...except... 执行顺序:正常执行:try-->执行代码--->结束 遇到异常:try-->遇到异常-->跳到except--->结束 ps:except分支可以有多个 执行顺序:执行匹配到第一个except则退出 如果父类异常在最前面,会吞噬所有子类异常(建议:先except子类,再except父类) 如果except捕获的错误与触发的错误不一致,程序会捕获不到 else子句:没有发生异常时执行

 try:
    #a = 1/0
    a = "hello"
except ZeroDivisionError as ms:
    print("zero division")
    print(ms)
else:
    print("code ok") 

finally子句:不管异常有没有发生都执行

 try:
    # a = 1/0
    b = "python"
    c = [1,2,3]
    print(c[4])
except ZeroDivisionError as msg:
    print("zero division")
else:
    print("code ok")
finally:
    print("this is finally")
print("end.....") 

except捕获的错误与触发的错误不一致,程序会捕获不到--->可设置多个分支 捕获到第一个except就退出 如果父类异常(Exception包括大部分异常类)在最前面,会吞噬所有异常类---建议把子类放到父类前

多函数(finally会造成异常丢失)

 def func2():
    try:
        int("abc")
    except ValueError as e:
        print(e)
    finally:
        return "return func2"
def func1():
    try:
        func2()
    except:
        print("func1 finally")
try:
    func1()
finally:
    print("main finally") 

手动触发异常(raise 异常名) raise 异常类("错误说明信息")

异常嵌套:

PS:不建议使用异常来代替常规的检查,如if...else判断 避免过多依赖于异常处理机制 在必要的时候,可以手动引发异常(raise)=> 函数或方法

在函数中,需要注意在try/except/finally使用return 1.在finally中使用return,异常无法回溯 2.在函数中的try/except语句使用return后,仍然会执行finally中的内容 finally => 正常或异常都执行 return => 直接退出函数,返回值给主程序

查看更多关于python12_异常处理的详细内容...

  阅读:32次