Python学习笔记(10):异常

当程序执行的时候,可能会出现一些异常现象,这个可能是会存在的。例如,你在读文件的时候,而那个文件不存在。此时,我们可以用异常来处理。

1. 错误

我们来做个简单的测试,我们故意把print方法写出Print。

>>> Print("Hello world")
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    Print("Hello world")
NameError: name 'Print' is not defined
>>>

系统会抛出NameError异常。

2. try..except

我们可以用try..except处理异常。

1
2
3
4
5
6
7
8
9
try:
    f = open("test.txt")
    f.close()
except(IOError):
    print("The file is not exist.")
except:
    print("Some error occurred.")
 
print("Done")

运行结果:

The file is not exist.
Done

3. 引发异常

你可以用raise语句来引发异常。我们先自定义一个ShortInputError异常,需要继承Exception类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ShortInputError(Exception):
    '''A user-defined exception class.'''
    def __init__(self, length, atleast):
        Exception.__init__(self)
        self.length = length
        self.atleast = atleast
 
try:
    s = input("Enter something -->")
    if len(s) < 3:
        raise(ShortInputError(len(s), 3))
    #Other work can continue as usual here
except(EOFError):
    print("Why did you do an EOF on me?")
except ShortInputError as e:
    print("ShortInputError: The input was of length %d, \
was expecting at least %d" % (e.length, e.atleast))
else:
    print("No exception was raised.")

输入两个字符运行结果:

>>>
Enter something -->tr
ShortInputError: The input was of length 2, was expecting at least 3
>>>

输入三个字符以上运行结果:

>>>
Enter something -->test
No exception was raised.
>>>

4. try..finally

假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。注意,在一个try块下,你可以同时使用except从句和finally块。如果你要同时使用它们的话,需要把一个嵌入另外一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
import time
 
try:
    f = open("poem.txt")
    while True: # our usual file-reading idiom
        line = f.readline()
        if len(line) == 0:
            break
        time.sleep(2)
        print(line),
finally:
    f.close()
    print("Cleaning up...closed the file")

运行结果:

>>>
Programming is fun

When the work is done

if you wanna make your work also fun:

    use Python!

Cleaning up...closed the file
>>>

1
2
3
4
5
6
7
8
9
def divide(x, y):
    try:
        result = x/ y
    except ZeroDivisionError:
        print("Division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")

测试结果:

>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
Division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    divide("2", "1")
  File "<pyshell#10>", line 3, in divide
    result = x/ y
TypeError: unsupported operand type(s) for /: 'str' and 'str'
>>>

posted @   known  阅读(7457)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示