Python学习手册之Python异常和

发布时间:2019-04-09 21:38:35编辑:auto阅读(1999)

    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件。

    查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963920.html

    异常和文件

    异常

    异常也叫例外。在之前的几篇文章中,你已经看到过异常。当程序运行错误是出现,比如不正确的调用和代码不规范等。当你的程序出现意外情况是就会发生异常并终止运行。
    下面代码用 5 除以 0 产生 ZeroDivisionError 异常。

    num1 = 5 
    num2 = 0
    print(num1/num2)

     运行结果:

    >>>
    ZeroDivisionError: division by zero
    >>>

    不同的原因产生不同的异常,一般有:
    ImportError:引入模块错误,通常是模块不存在。
    IndexError:读取列表超出索引范围。
    NameError:使用未声明的变量。
    SyntaxError:代码语法错误。
    TypeError:当操作或函数处理不合适类型。
    ValueError:内建操作或函数,接收到类型正确,但值不正确。

    Python 还有其他几个内置的异常,比如 ZeroDivisionError OSError。第三方库也经常定义自己的异常。

    异常处理
    我们使用 try/except 语句捕捉程序运行时产生的异常。
    try 块用来包含可能产生异常的代码块。如果产生异常 try 块停止运行,except 块里的代码开始执行,如果程序运行一切正常,则不会执行 except 块里的代码。

    try:
     num1 = 5
     num2 = 0
     print(num1/num2)
     print("Done!")
    except ZeroDivisionError:
     print("Has a error")
     print("due to zero division")

    运行结果:

    >>>
    Has a error
    due to zero division
    >>>
    上面的例子里 except 语句定义了 ZeroDivisionError 异常捕捉。

    try 语句可以拥有多个 except 定义语句来处理异常。多个异常也可以使用一个 except 块来捕捉。

    try:
     var = 5
     print(var + "string!")
     print(var/2)
    except ZeroDivisionError:
     print("Divided by zero!")
    except (ValueError,TypeError):
     print("Has a error!")

    运行结果:

    >>>
    Has a error!
    >>>

    except 语句如果没有申明要铺获的异常,将捕获所有的异常。我们应该谨慎地使用这种异常处理方式,它虽然捕获了意外错误但是却把编程错误隐藏了。

    try:
     var = 5
     print(var + "string!")
     print(var/2)
    except:
     print("An error occurred")

    运行结果:

    >>>
    An error occurred
    >>>
    这种异常处理方式通常用在处理用户输入。

    finally 语句
    假设你正在读取一份文件。你应该确保文件对象被正确关闭,无论是否会发生异常。
    为了确保代码最终能够运行不论是否有异常发生,我们可以使用 finally 语句。finally 放在 try/except 语句的后面。

    try:
     str = "Hello"
     var = 5
     print(str)
     print(var/0)
    except ZeroDivisionError:
     print("Divided by zero")
    finally:
     print("This code will run no matter what")

    运行结果:

    >>>
    Hello
    Divided by zero
    This code will run no matter what
    >>>

    下面代码会输出什么?

    try:
     print(1)
    except:
     print("a")
    finally:
     print("Hello")

    运行结果:

    >>>
    1
    Hello
    >>>

    finally 语句最终会被执行不管前面的异常到没有捕捉到,包括在 except 语句里产生的异常。

    try:
     print(1)
     print(5/0)
    except ZeroDivisionError:
     print(Error_var)
    finally:
     print("This is executed last!")

    运行结果:

    >>>
    1
    This is executed last!
    ZeroDivisionError: division by zero
    During handling of the above exception, another exception occurred:
    NameError: name 'Error_var' is not defined
    >>>

     

    抛出异常
    使用 raise 语句抛出一个异常

    print(1)
    raise ZeroDivisionError
    print(5)

    运行结果:

    >>>
    1
    ZeroDivisionError
    >>>
    你需要声明你要抛出的例外名称。

    抛出的异常可以用参数来指出这是什么错误。

    age = 12
    raise TypeError("Invalid type!")

    运行结果:

    >>>
    TypeError("Invalid type!")
    >>>

    except 块里,raise 语句可以不用声明异常的名称重新抛出捕捉到的异常。

    try:
     num= 5/0
    except:
     print("Has a error")
     raise 

    运行结果:

    >>>
    ZeroDivisionError: division by zero
    
    Has a error
    >>>

    断言
    Python 的断言就是检测一个条件。如果条件为真,它什么都不做,条件为假会触发一个错误信息。
    断言可以打开或关闭。断言使用 assert 语句声明。

    print(1)
    assert 1 + 2 == 3
    print("Yes")
    assert 1 + 1 == 0
    print("Yes")

    运行结果:

    >>>
    1
    Yes
    AssertionError
    >>>
    程序员通常在函数的开头放置断言以检查有效的输入,在函数调用之后放置断言以检查有效的输出。
    断言可以在运行是通过添加 -O 或 -OO 选项来关闭。

    下面代码打印出来什么?

    print(1)
    assert 1 != 2
    print(2)
    assert True
    print(3)
    assert False
    print(4)
    assert 1 + 1 == 2
    print(5)

    运行结果:

    >>>
    1
    2
    3
    AssertionError
    >>>

    断言的第二个参数可以用来给 AssertionError 做参数。

    num = 5
    assert (num <= 0),"The num is bigger than zero"

    运行结果:

    >>>
    AssertionError: The num is bigger than zero
    >>>
    AssertionError 异常可以像任何其他异常一样使用 try/except 语句被捕捉和处理,如果程序不处理,这种类型的异常将终止程序的运行。

    文件处理

    打开文件
    读写文件是最常见的 IO(输入输出)操作。Python 内置了读写文件的函数,要读写文件需要打开一个文件对象,使用 open 函数。
    open 函数打开的对象在 Python 中统称为 file-like Object。除了文件外,还可以是内存的字节流,网络流,自定义流等等。

    f = open("test.txt")
    注意:open 函数的参数是文件的路径。如果文件与程序位于同一个目录中,则可以不要指定路径直接使用文件名。

    可以使用 open 函数的第二个参数来指定打开文件的模式。

    # read mode
    open("test.txt", "r")
    open("test.txt")
    
    # write mode
    open("test.txt", "w")
    
    # binary write mode
    open("test.txt", "wb")

    打开文件模式列表:

    特别注意:使用 "w" 模式时,如果文件已经存在,会把旧文件的内容全部都清除掉。

    文件打开后应该使用 close 方法关闭文件。

    f = open("test.txt","w")
    # close the file
    f.close()
    接下来我们会读取和写入文件。

    读取文件
    使用 open 方法打开的文件可以使用 read 方式来读取内容。

    f = open("test.txt","r")
    content = f.read()
    print(content)
    f.close()
    打印文件名为 "test.txt" 的所有内容。

    若要读取一定数量的文件内容,可以使用一个数字作为参数来调用 read 函数。该数字确定要读取多少个字节的内容。
    可以对同一个文件对象进行多次的 read 调用,该字节读取文件内容。在没有参数的情况下,read 函数返回文件的其余部分。

    f = open("test.txt","r")
    print(f.read(32))
    print(f.read(16))
    print(f.read(8))
    print(f.read())
    f.close()

    当所有的内容被读取后,再调用 read 函数返回空字符串。

    f = open("test.txt","r")
    f.read()
    print("reading")
    print(f.read())
    print("finished!")
    f.close()

    运行结果:

    >>>
    reading finished! >>>

    打开一个文件读取它的内容,打印内容的长度。

    f = open("test.txt","r")
    str = f.read()
    print(len(str))
    f.close()

    运行结果:

    >>>
    16
    >>>

    要一行一行地读取,我们可以使用 readline 方法,也使用 readlines 一次读取所有内容并返回一个列表,列表里的每一项元素表示一行内容。

    f = open("test.txt","r")
    print(f.readlines())
    f.close()

     运行结果:

    >>>
    ['I like Python!!!']
    >>>

    使用 for 语句遍历文件的每一行:

    f = open("test.txt","r")
    for line in f:
     print(line)
    f.close()

    运行结果:

    >>>
    Line 1 : Hello world!
    
    Line 2 : I like Python!
    
    Line 3 : I like Java!
    >>>
    在输出中,返回的行包含换行符,打印 print 函数在输出的末尾自动添加新行。

    写文件
    使用 write 方法把内容写到文件里。

    f = open("test.txt","w")
    f.write("I am happy!")
    f.close()
    
    f = open("test.txt","r")
    print(f.read())
    f.close()

    运行结果:

    >>>
    I am happy!
    >>>
    如果文件不存在,"w" 将会创建一个文件。

    写入模式下,如果文件存在将清除全部内容并往文件写入新内容。

    f = open("test.txt","r")
    print("Reading...")
    print(f.read())
    print("Finished!")
    f.close()
    
    f = open("test.txt","w")
    f.write("New text")
    f.close()
    
    f = open("test.txt","r")
    print("Reading new contents")
    print(f.read())
    print("Finished!")
    f.close()

    运行结果:

    >>>
    Reading...
    I am happy!
    Finished!
    Reading new contents
    New text
    Finished!
    >>>
    特别注意:原有的文件将被新内容重写。

    如果 write 写入成功,方法返回写入的字节数。

    msg = "I like Python!!!"
    f = open("test.txt","w")
    count = f.write(msg)
    print(count)
    f.close()

    运行结果:

    >>>
    16
    >>>

    读写文件
    确保文件在使用后始终关闭,避免浪费资源是良好的编程习惯。我们使用 try/finally 语句。

    try:
     f = open("test.txt")
     print(f.read())
    finally:
     f.close()
    当异常发生时也能确保文件对象被正确关闭。

    每次都这样要关闭文件是在太繁琐。所以,Python 引入了 with 语句来帮我们自动调用 close() 方法。

    with open("test.txt") as f:
    print(f.read())
    使用 with 语句打开文件是个好习惯,就算有例外发生,with 语句也会自动帮我们关闭文件句柄。

     

     

     

    “朝着一个方向疯狂奔跑的感觉,真好。”

关键字