异常处理

1.NamError

访问未定义的变量

>>> print (jj)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'jj' is not defined

最后一行包含了错误的详细信息,其余行显示它是如何发生(或什么引起该异常)的详细信息。

2. TypeError

TypeError 也是一种经常出现的异常。当操作或函数应用于不适当类型的对象时引发,一个常见的例子是对整数和字符串做加法。

>>> print (1+'zw')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

3.异常处理

try:
    statements to be inside try clause
    statement2
    statement3
    ...
except ExceptionName:
    statements to evaluated in case of ExceptionName happens

它以如下方式工作:

首先,执行 try 子句 (在 try 和 except 关键字之间的部分)。

如果没有异常发生,except 子句 在 try 语句执行完毕后就被忽略了。

如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。

如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的 except 子句。然后继续执行 try 语句之后的代码。

如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。

如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息

def get_number():
    ":return a float number"
    number = float (input("请输入一个float类型数字:"))
    return number

while True:
    try:
        print(get_number())
    except ValueError:
        print("输入错误数据类型。")

请输入一个float类型数字:33.3
33.3
请输入一个float类型数字:21
21.0
请输入一个float类型数字:55.44212
55.44212
请输入一个float类型数字:f
输入错误数据类型。
请输入一个float类型数字:da
输入错误数据类型。

4.抛出异常

raise

当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行

try:
     s = None
     if s is None:
         print "s 是空对象"
         raise NameError     #如果引发NameError异常,后面的代码将不能执行
     print len(s)  #这句不会执行,但是后面的except还是会走到
except TypeError:
     print "空对象没有长度"
 
s = None
if s is None:
    raise NameError 
print 'is here?' #如果不使用try......except这种形式,那么直接抛出异常,不会执行到这里

我们可以使用raise语句自己触发异常

raise语法格式如下:

raise [Exception [, args [, traceback]]]

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。

最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。

>>> raise ValueError("A value error happened.")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: A value error happened.

5.定义清理行为

try 语句还有另一个可选的 finally 子句,目的在于定义在任何情况下都一定要执行的功能。

不管有没有发生异常,finally 子句 在程序离开 try 后都一定会被执行。当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中),在 finally 子句执行完后它会被重新抛出。

在真实场景的应用程序中,finally 子句用于释放外部资源(文件或网络连接之类的),无论它们的使用过程中是否出错。

 

posted @ 2018-08-23 15:12  myself_think  阅读(104)  评论(0)    收藏  举报