你可以提高使用异常raise 提供的错误/异常的名称和异常对象将被声明抛出。 您可能引发的错误或异常应该是一个类,该类必须直接或间接地是该类的派生Exception 类。 示例(另存为exceptions_raise.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)
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 exceptions_raise.py
Enter something --> a
ShortInputException: The input was 1 long, expected at least 3
$ python exceptions_raise.py
Enter something --> abc
No exception was raised.
这个怎么运作 在这里,我们正在创建我们自己的异常类型。这种新的异常类型称为ShortInputException 。它有两个字段-length 这是给定输入的长度,atleast 这是程序期望的最小长度。 在except 子句中,我们提到了错误的类别,该类别将存储as 在变量名中,以保存相应的错误/异常对象。这类似于函数调用中的参数和自变量。在此特定except 子句中,我们使用异常对象的length 和atleast 字段向用户打印适当的消息。 尝试...最后假设您正在读取程序中的文件。无论是否引发异常,如何确保文件对象正确关闭?可以使用该finally 块来完成。 将该程序另存为exceptions_finally.py : import sys
import time
f = None
try:
f = open("poem.txt")
while True:
line = f.readline()
if len(line) == 0:
break
print(line, end='')
sys.stdout.flush()
print("Press ctrl+c now")
time.sleep(2)
except IOError:
print("Could not find file poem.txt")
except KeyboardInterrupt:
print("!! You cancelled the reading from the file.")
finally:
if f:
f.close()
print("(Cleaning up: Closed the file)")
输出: $ python exceptions_finally.py
Programming is fun
Press ctrl+c now
^C!! You cancelled the reading from the file.
(Cleaning up: Closed the file)
这个怎么运作 我们进行通常的文件读取工作,但是我们使用time.sleep 函数在每行打印后任意引入了2秒钟的睡眠时间,以使程序运行缓慢(Python本质上是非常快的)。当程序仍在运行时,按ctrl + c 中断/取消程序。 观察到KeyboardInterrupt 引发了异常,程序退出了。但是,在程序退出之前,将执行finally子句,并且文件对象始终处于关闭状态。 请注意,PythonNone 会考虑分配值为0的变量或为空序列或集合的变量False 。这就是为什么我们可以if f: 在上面的代码中使用它的原因。 还要注意,我们使用sys.stdout.flush() after,print 以便它立即打印到屏幕上。 |