Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 425|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-6-1 16:29:26 | 显示全部楼层 |阅读模式

          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状态了。即使在读文件里的每一行遇到错误,也会关闭掉。

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 20:54 , Processed in 0.063705 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表