简明Python3教程 15.异常

简介: 简介 当程序发生意外情况时则产生异常。 例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢? 上述情形通过异常进行处理。 类似的,如果你的程序存在一些非法语句会发生什么呢?这时python会举手告诉你存在一个错误。

简介

当程序发生意外情况时则产生异常。

例如你需要读一个文件而这个文件并不存在会咋样?又或者是程序运行时你把它误删除了呢?

上述情形通过异常进行处理。

类似的,如果你的程序存在一些非法语句会发生什么呢?这时python会举手告诉你存在一个错误。

 

错误

考虑一个简单的print函数调用。如果我们把print错拼成Print(注意大小写),这时python将引发一个语法错误。

    >>> Print('Hello World')

    Traceback (most recent call last):

      File "<pyshell#0>", line 1, in <module>

        Print('Hello World')

    NameError: name 'Print' is not defined

    >>> print('Hello World')

    Hello World

我们看到一个NameError被引发并且发生错误的位置也被打印出来。这就是一个错误处理器(error handler)为这个错误所进行的处理。

 

异常

我们尝试从用户读取输入,看看当键入ctrl-d(注:windows用户输入ctrl-z)时会发生什么。

    >>> s = input('Enter something --> ')

    Enter something -->

    Traceback (most recent call last):

      File "<pyshell#2>", line 1, in <module>

        s = input('Enter something --> ')

EOFError: EOF when reading a line

(注:也许你看到的信息会所有不同,但只要引发了EOFError即可)

可以看到python引发了一个被称作EOFError的异常,一般这意味着它遇到了一个非期望的文件尾(end of file)符号(注:windows下为ctrl-z)

 

处理异常

利用try...except语句使得我们可以处理异常。通常我们将语句放入try块而将错误处理放到except块中。

#!/usr/bin/python

# Filename: try_except.py

try:

    text = input('Enter something --> ')

except EOFError:

    print('Why did you do an EOF on me?')

except KeyboardInterrupt:

    print('You cancelled the operation.')

else:

    print('You entered {0}'.format(text))

输出:

    $ python try_except.py

    Enter something -->     # Press ctrl-d

    Why did you do an EOF on me?

   

    $ python try_except.py

    Enter something -->     # Press ctrl-c

    You cancelled the operation.

   

    $ python try_except.py

    Enter something --> no exceptions

    You entered no exceptions

代码如何工作:
我们将可能引起异常/错误的所有语句放入try块,然后将适当的错误/异常处理器放进except块/从句中。

except从句可以处理一个单一的指定的错误或异常,或者一组括在小括号中的异常/错误。

如果没有给出异常或错误,则except会处理所有的错误和异常。

注意每个try至少要关联一个except从句,否则只存在try块有啥意义呢?

任何没有被处理的错误或异常都会导致python默认处理器的调用,它的作用仅仅是终止程序运行并将错误信息打印出来。前面我们已经见识过了。

你还可以为try..except块关联一个else从句。如果没有异常发生则else块被执行。

下面的例子中,我们将看到如何得到异常对象获取额外的异常信息。

 

引发异常

通过raise语句你可以引发异常。为raise语句提供错误/异常名后异常对象会被抛出。

你抛出的错误或异常必须是一个间接或直接派生自Exception类的类。

#!/usr/bin/python

# Filename: raising.py

class ShortInputException(Exception):

    '''A user-defined exception class.'''

    def __init__(self, length, atleast):

        Exception.__init__(self)

        self.length = length

        self.atleast = atleast

try:

    text = input('Enter something --> ')

    if len(text) < 3:

        raise ShortInputException(len(text), 3)

    # Other work can continue as usual here

except EOFError:

    print('Why did you do an EOF on me?')

except ShortInputException as ex:

    print('ShortInputException: The input was {0} long, expected at

least {1}'/

          .format(ex.length, ex.atleast))

else:

    print('No exception was raised.')

输出:

    $ python raising.py

    Enter something --> a

    ShortInputException: The input was 1 long, expected at least 3

   

    $ python raising.py

    Enter something --> abc

    No exception was raised.

范例如何工作:

这里,我们创建了自己的异常类型。这个新的异常类型被称作ShortInputException

ShortInputException拥有两个字段 – length指出给定输入的长度,而atleast为程序希望输入的最小长度。

在except从句中,我们给定异常类并将其对象存储为一个变量。这就类似于函数调用中的形参与实参。

在这个特定的except从句中,我们利用异常对象的length和atleast字段向用户打印出适当的提示信息。

 

try...finally

假设你的程序正在读取一个文件。如何保证无论是否发生异常文件对象都能被适当的关闭?这可以通过finally块做到。

注意你可以同时为try块关联except和finally块。如果你希望同时使用两者则必须将一个嵌入另一个中。

#!/usr/bin/python

# Filename: finally.py

import time

try:

    f = open('poem.txt')

    while True: # our usual file-reading idiom

        line = f.readline()

        if len(line) == 0:

            break

        print(line, end='')

        time.sleep(2) # To make sure it runs for a while

except KeyboardInterrupt:

    print('!! You cancelled the reading from the file.')

finally:

    f.close()

    print('(Cleaning up: Closed the file)')

输出:

    $ python finally.py

    Programming is fun

    When the work is done

    if you wanna make your work also fun:

    !! You cancelled the reading from the file.

    (Cleaning up: Closed the file)

代码如何工作:

我们执行一个常见的读文件操作,但故意在打印每行后利用time.sleep函数让程序休眠2秒,因此程序会运行的比较慢。

当程序运行时输入ctrl-c将中断/取消程序的运行。

注意ctrl-c会导致抛出KeyboardInterrupt异常,随后程序结束。但在程序结束前finally会被执行因此文件对象永远都会被关闭。

 

with语句

在try块中获得资源后在finally块中释放之是很常见的设计方式。因此python提供with语句给予更简洁的实现方式。

#!/usr/bin/python

# Filename: using_with.py

with open("poem.txt") as f:

    for line in f:

        print(line, end='')

代码如何工作:

程序的输出应该和上面的范例相同。程序的不同之处在于我们在with语句中使用open函数 – 如此with语句就会自动关闭文件了。

在幕后with与用户有一个协议。它将读取open语句返回的对象,这里我们将这个对象称为”thefile”

在with块的开始处,with永远都会调用thefile.__enter__方法而在块结束处又会调用thefile.__exit__方法。

因此我们在finally块中的代码被委托给__exit__方法了。这将帮助我们避免反复的使用try..finally块。

关于此主题更多的讨论已经超出本书范围,详见(http://www.python.org/dev/peps/pep-0343/) (注:看本地文档也行)

 

小结

我们已经讨论了try...except和try...finally的用法。并了解到如何创建自己的异常类型与引发异常。

下面,我们将研究python标准库。

 

 

 

--------------Python书籍推荐-----------------
Python基础教程-第2版.修订版 
 
 
PYTHON核心编程
 
 
零基础学Python
目录
相关文章
|
1月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
118 1
|
2月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
675 19
|
8月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1001 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
2月前
|
数据采集 存储 JSON
使用Python获取1688商品详情的教程
本教程介绍如何使用Python爬取1688商品详情信息,涵盖环境配置、代码编写、数据处理及合法合规注意事项,助你快速掌握商品数据抓取与保存技巧。
|
4月前
|
机器学习/深度学习 数据安全/隐私保护 计算机视觉
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异
|
4月前
|
XML Linux 区块链
Python提取Word表格数据教程(含.doc/.docx)
本文介绍了使用LibreOffice和python-docx库处理DOC文档表格的方法。首先需安装LibreOffice进行DOC到DOCX的格式转换,然后通过python-docx读取和修改表格数据。文中提供了详细的代码示例,包括格式转换函数、表格读取函数以及修改保存功能。该方法适用于Windows和Linux系统,解决了老旧DOC格式文档的处理难题,为需要处理历史文档的用户提供了实用解决方案。
401 1
|
3月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
248 0
|
3月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
6月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
451 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

推荐镜像

更多
下一篇
oss云网关配置