team470 发表于 2015-4-25 11:32:26

Python学习笔记(10):异常

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

1. 错误
  我们来做个简单的测试,我们故意把print方法写出Print。
  >>> Print("Hello world")
Traceback (most recent call last):
File "", line 1, in
    Print("Hello world")
NameError: name 'Print' is not defined
>>>
  系统会抛出NameError异常。

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



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类。



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块。如果你要同时使用它们的话,需要把一个嵌入另外一个。



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
>>>



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 "", line 1, in
    divide("2", "1")
File "", line 3, in divide
    result = x/ y
TypeError: unsupported operand type(s) for /: 'str' and 'str'
>>>
页: [1]
查看完整版本: Python学习笔记(10):异常