python学习笔记系列----错误和异常

Posted loleina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习笔记系列----错误和异常相关的知识,希望对你有一定的参考价值。

      python至少有2类不同的错误:语法错误(Syntax Errors)和异常(Exceptions)。

8.1 语法错误

      这个单词应该还是很有必要认识的,呵呵,语法错误,也叫解析错误,是我们最不愿意发生的错误,直接拿官网的例子:

>>> while True print Hello world
  File "<stdin>", line 1, in ?
    while True print Hello world
                   ^
SyntaxError: invalid syntax

      语法错误提示时会先打印出现语法的语句然后在这语句中打上‘ ^ ’ 表示离语法错误最近的地方。例子中就是在print前少了引号(这是一个死循环~~):

>>> while True: print Hello world
...
Hello world

8.2 异常
      一个语句或者一个表达式即使编译时是没有语法错误的,但是也有可能在执行时出现问题,这种问题也叫异常(非致命性),异常通常都是有在程序中进行处理的。异常是有不同类型的,常见的异常类型有ZeroDivisionError, NameError and TypeError,这类异常称为标准异常,是在build-in里面定义的,可以查看Built-in Exceptions。还有一类异常是用户自定义的。

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero>>> 2 + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate str and int objects

8.3 处理异常

    直接给一个比较全的异常处理的例子:打开一个txt文档,读入第一行的数据,转换成int数据类型,如果都成功,就打印txt总共有多少行,最后关闭文档。

    try:
        f = open (test.txt,r+)
        s = f.readline()
        i = int(s.strip())
    except IOError as e:
        print I/O error({0}):{1}.format(e.errno,e.strerror)
    except ValueError:
        print "could not convert data to integer"
    except:
        print "unexpected error:",sys.exc_info()[0]
    else:
        print there has {0} lines in the file.format(len(f.readlines()))
    finally:
        print end of the function
        f.close()

try语句处理异常,是这样做的:

  A. 首选,try子语句(try和except关键字之间的语句)会被执行。

  B. 如果没有异常发生,except 子句被略过。

  C. 如果有异常发生,try后面的其他语句就被跳过了,如果异常类型在except关键字后匹配,这个except子句被执行。

  D. 如果没有异常发生,else子句就会被执行。else的作用是它避免了捕获未保护的代码所发起的异常。

  E. finally语会在try子句执行完毕之前执行,不管是否发生或者不发生异常。当一个异常发生在try子句中却未被处理时(或者发生在except或者else子句中时),finally子句执行完后会再次抛出异常。

这些基本的语法,应该也基本都是比较清楚的,文档里列出了一些需要注意的地方:

第一:一次性处理多个异常时,多个异常需要用括号括起来。 

       except (RuntimeError, TypeError): 这样是正确的;except RuntimeErrorTypeError: 写法是错误的,因为except ValueError, e 在语法上等价于except ValueError as e。

第二:最后一个except子句可以不带异常类型名,这样就可以捕获任何未被定义的异常。

第三:当一个异常发生时,可能它还有一些异常的参数。except语句的异常名字后面可以跟一个参数,这个参数会跟异常实例绑定,存储在instance.args中,如果异常中__str__() 定义过了,就可以直接打印出参数了。

>>> try:
...     raise Exception(spam, eggs)
... except Exception as inst:
...     print type(inst)     # the exception instance
...     print inst.args      # arguments stored in .args
...     print inst           # __str__ allows args to be printed directly
...     x, y = inst.args
...     print x =, x
...     print y =, y
...
<type exceptions.Exception>
(spam, eggs)
(spam, eggs)
x = spam
y = eggs

8.4 用户自定义异常

     用户自定义的异常需要继承Exception类,官网例子如下:

>>> class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
...
>>> try:
...     raise MyError(2*2)
... except MyError as e:
...     print My exception occurred, value:, e.value
...
My exception occurred, value: 4
>>> raise MyError(oops!)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: oops!

       在这个例子中,init方法被重写了,用于创建一个新的成员变量value。

8.5 已定义好的清理行为

      当不再需要这个对象的时候,有一些对象已经定义好了标准的清理行为,不管使用这个对象操作成功或者失败;常见的例子还是打开文档:

for line in open("myfile.txt"):
    print line,

       这段代码的问题是在这段代码执行后,文档处于open的状态时间是不确定的,在一个小的脚本里,这不会是一个很严重的问题,但是如果是一个大应用程序中的一部分,这个问题就会被放大。使用with语句,就允许一些像files的类在使用完后能被清理完(释放某些资源吧,我是这样理解的):

with open("myfile.txt") as f:
    for line in f:
        print line,

       换成这行代码后,f已经处于close状态了。即使在读文件里的每一行遇到错误,也会关闭掉。

 

 

以上是关于python学习笔记系列----错误和异常的主要内容,如果未能解决你的问题,请参考以下文章

python 学习笔记day06-错误和异常函数基础

学习笔记:python3,代码片段(2017)

Struts2-学习笔记系列(13)-类型转换异常和校验器

python学习笔记8:异常处理

Python学习笔记-异常

python学习笔记(十五)异常处理