zoukankan      html  css  js  c++  java
  • 第九章 异常处理[DDT书本学习 小甲鱼]【1】

    9.1 你不可能总是对的
    举例如下
    file_name=input("请输入文件的名称:")
    s="C:\Users\Daodantou\Desktop\"+file_name
    f=open(s,"r",encoding="UTF-8")
    print("文件的内容是:")
    for each in f:
    print(each)
    -------------------------------
    请输入文件的名称:record.txt
    文件的内容是:
    小甲鱼:你好
    。。。。。。
    小甲鱼:别这么称呼我,不适应呢

    小客服:旁边玩去,我很忙。
    =================================
    但是如果输入的不是record.txt,则会报错。如下
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 3, in <module>
    f=open(s,"r",encoding="UTF-8")
    FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\Daodantou\Desktop\322.txt'
    ==============================================================================================
    以上程序,在客户输入错误的情况下,出现BUG了,FileNotFoundError报错。属于异常。
    那么一般都有那些异常呢?
    1.AssertionError:断言语句失败 当assert这个关键字后面条件为假,程序停止抛出异常。
    assert语句一般用于测试程序的时候,置入检查点:
    my_list=["导弹头"]
    assert len(my_list)>0 #True
    print(my_list.pop())
    assert len(my_list)>0 #False
    ------------------------------------
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 4, in <module>
    assert len(my_list)>0 #False
    AssertionError
    =========================================
    2.AttributeErro:尝试访问未知的对象属性
    mylist=[]
    print(mylist.daodantou)
    --------------------------
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
    print(mylist.daodantou)
    AttributeError: 'list' object has no attribute 'daodantou'
    ==========================================================
    3.IndexError:索引超出序列范围
    mylist=[1,2,3]
    print(mylist[3])
    --------------------
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
    print(mylist[3])
    IndexError: list index out of range
    ===========================================================
    4.KeyError:字典中查找一个不存在的关键字
    试图在字典查找一个不存在的关键字时候会引发异常,因此建议使用dict.get()方法,
    因为dict.get()方法,因为没找到,会返回None或者指定内容,而不会报异常。
    mydict={"one":1,"two":2,"three":3}
    print(mydict["one"])
    print(mydict["four"])
    --------------------------------------
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 3, in <module>
    print(mydict["four"])
    KeyError: 'four'
    ==========================================
    5.NameError:尝试访问一个不存在的变量
    mydict1={"one":1,"two":2,"three":3}
    print(mydict["one"])
    -------------------------------------------
    Traceback (most recent call last):
    File "C:/PycharmProjects/my1/t2.py", line 2, in <module>
    print(mydict["four"])
    NameError: name 'mydict' is not defined
    =============================================
    6.OSError:操作系统产生异常
    上述开头那个示例中FileNotFoundError异常就是OSError的子类,不再重复。
    ===============================================
    7.SyntaxError:Python的语法错误
    print "I love Daodantou"
    -------------------------
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print("I love Daodantou")?
    ================================================
    8.TypeError:不同类型间的无效操作
    print(1+"1")
    -------------------------------
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    ================================
    9.ZeroDivisionError:除数为零
    a=5/0
    print(a)
    -------------
    ZeroDivisionError: division by zero
    ===================================
    总结
    程序抛出异常就说明程序有问题,但问题不致命,所以捕获异常,纠正错误即可,那么,
    该如何捕获异常呢?可以通过try语句实现,任何出现try语句范围内的异常都会被捕获。
    try语句有两种形式:一种是try-except,另一种是try-finally.
    =====================================
    9.2 try-except语句 用来检测和处理异常
    语句格式如下:
    try:
    检测范围
    except Exception[as reason]:
    出现异常后的处理代码
    =========举例如下==============
    f=open("我为何是个虫子.txt","r",encoding="UTF-8")
    print(f.read())
    f.close()
    ----------------------------------
    FileNotFoundError: [Errno 2] No such file or directory: '我为何是个虫子.txt'
    ========因为没有找到该文件,所以报异常了,用户体验不好!修改如下===============
    try:
    f=open("我为何是个虫子.txt","r",encoding="UTF-8")
    print(f.read())
    f.close()
    except OSError:
    print("文件打开过程出错了")
    -----------------------------------
    文件打开过程出错了
    ==============================用户被告知了错误,用户体验会好很多=================
    不过,程序员角度看,导致OSError的异常原因很多,更在意具体内容,这里可以用as
    except OSError as reason:
    print("文件打开出错了, 出错原因是:"+str(reason))
    --------------------------------------------------------
    文件打开出错了,
    出错原因是:[Errno 2] No such file or directory: '我为何是个虫子.txt'
    =======================================================================
    还有三种变式处理方法,分别是
    1)一对多 针对不同异常 设置多个except
    2)多对一 对多个异常 统一处理
    3)笼 统 捕获所有异常
    --------------------------- 分别举例练习如下 -----------------------
    1)
    try:
    sum=1+"1"
    f=open("我是一个不存在的文件.txt")
    print(f.read())
    f.close()
    except OSError as reason:
    print("文件出错了 错误原因是:"+str(reason))
    except TypeError as reason:
    print("类型出错了 错误原因是:"+str(reason))
    ----------------------------------------------------
    类型出错了
    错误原因是:unsupported operand type(s) for +: 'int' and 'str'
    ==============================================================
    2)
    try:
    int("abc")
    sum=1+"1"
    f=open("我是一个不存在的文件.txt")
    print(f.read())
    f.close()
    except(OSError,TypeError):
    print("出错了 错误原因是:"+str(reason))
    -----------------------------------------------
    这个例子有问题????????????????????
    ======================================================
    3)
    try:
    int("abc")
    sum=1+"1"
    f=open("我是一个不存在的文件.txt")
    print(f.read())
    f.close()
    except:
    print("出错了,不说原因的那种!")
    -------------------------------------------
    出错了,不说原因的那种!
    ===========================================

    9.3 try-finally语句
    假设 "我是一个不存在的文件.txt"真实存在,open()函数正常返回文件对象,异常发生在
    sum=1+"1"上,此时Python直接跳到了except语句,也就是说,没有执行关闭文件的命令。
    代码如下:
    try:
    f=open("我是一个不存在的文件.txt")
    print(f.read())
    sum=1+"1"
    f.close()
    except:
    print("出错了")
    -----------------出现了异常,但是崩溃前应当有收尾工作(比如保存用户数据)
    -----------------引入finally来扩展try 【finally=无论如何都将执行的语句】
    try:
    f=open("我是一个不存在的文件.txt")
    print(f.read())
    sum=1+"1"
    except:
    print("出错了")
    finally:
    f.close()
    =================================================
    9.4 raise语句 主动抛出异常
    try:
    s = None
    if s is None:
    print('s是空对象')
    raise NameError #后面代码不再执行
    print(len(s))

    except Exception:
    print('空对象没有长度') #仍旧执行的代码
    ------------------------------------------------------
    9.5 丰富的else语句
    1.如果,否则
    if 条件:
    条件成立 执行体
    else:
    条件不成立 执行体
    2.else可以跟for和while循环语句搭配,但是else语句块只有等待循环体执行完成后,
    才执行。如若循环体中间用break语句跳出循环,那么else语句块将不再执行了。
    举例如下:
    def showMaxFactor(num):
    count=num//2
    while count>1:
    if num%count==0:
    print("%d最大的约数是%d"%(num,count))
    break
    count-=1
    else:
    print("%d是素数!"%num)

    num=int(input("请输入一个整数:"))
    showMaxFactor(num)
    -------------------------------------
    请输入一个整数:12
    12最大的约数是6
    ==================================================================
    3.和上述循环语句相同,没有异常,那就继续吧!有异常不执行。
    try:
    int("abc")
    except ValueError as reason:
    print("出错了"+str(reason))
    else:
    print("没有任何异常出现啊!")
    --------------------------------
    出错了invalid literal for int() with base 10: 'abc'
    =====================================================================
    9.6 简洁的with语句
    程序中既要打开又要关闭文件,还要关注异常处理有点烦人,出现了with
    举个例子:
    try:
    f=open("record.txt","w",encoding="UTF-8")
    for each_line in f:
    print(each_line)
    except OSError as reason:
    print("出错了:",str(reason))
    finally:
    f.close()
    ---------------------以上代码,可以用with改写--------------------------
    try:
    with open("record.txt","w",encoding="UTF-8") as f:
    for each_line in f:
    print(each_line)
    except OSError as reason:
    print("出错了:",str(reason))
    ----------------------------------
    出错了: not readable

    Daodantou:“不积跬步,无以至千里.”
  • 相关阅读:
    Spyder 快捷键大全
    上传代码到github,出现 git@github.com: Permission denied (publickey) 错误
    Linux ubuntu 安装 openssh-server 报错
    win10删除「此电脑」中的文档、视频、音乐、下载、图片、桌面等6个文件夹的方法
    IDEA 光标闪烁问题
    委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
    C#6.0的新语法特性
    创建多个网站
    发送短信功能(C#)
    VS开发Windows服务
  • 原文地址:https://www.cnblogs.com/daodantou/p/10359966.html
Copyright © 2011-2022 走看看