• 20181220(异常,断言,网络编程初步)


     

    一、异常

    1、异常:程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止。异常是类的实例,实例可以被引用,并且可以进行捕捉,进而使得错误被处理。

    如果没有处理异常,异常就会向上传播直到顶层。也就是说,可以在顶层处理程序中的异常。

    2、一个异常分为三部分: ​ ①异常的追踪信息 ​ ②异常的类型 ​ ③异常的值

    3、排查错误: Ⅰ 定位到错误发生的位置 ​ 查看追踪信息 ​ 1、代码全是自己写的,没有调用内置或第三方的内容,错误一定在最后一行 ​ 2、如果代码调用了内置或第三方 ​ ①调用的系统内置模块,例如抛出位置在object.py(系统内置),可能是你在调用时的参数出错。 ​ ②第三方模块可能真的存在错误,可以按照追踪信息检查问题。 ​ 如果有很多追踪信息,首先查看最后一行。 Ⅱ 查看异常类型 Ⅲ 查看异常的值 如果没有任何异常信息,但是程序运行还是有问题,那么就使用排除法(一段一段运行)

    4、异常的分类: ​ Ⅰ 语法异常: ​ 解释器在执行代码前会先检测语法,检测通过才会开始执行,否则一行都不会执行。 ​ 这类异常应该在程序执行前就改正

    Ⅱ 逻辑上的异常(运行时的异常) ​ 通过语法检测,在解析执行期间发生异常。

    5、异常完整的书写顺序

    try except # 可以有多个 else finally

     

    最简单的形式:


    try:
       print(1)  # 此句会执行
       a = int("abc")
       print(2) # 此句不会执行
    except ValueError:  
       print("我是谁?我在哪?")
    print("over")  # 因为上面的异常可以被捕捉到,所以程序可以继续执行。此句会执行。如果异常没被捕捉处理,那么此句不会执行。

    输出结果:
    1
    我是谁?我在哪?
    over

    可以有多个except


    try:
       "要执行的语句块"
    except ValueError:
       print("我是谁?我在哪?")

    except IndexError:
       print("我又是谁?我又在哪?")

    在一个except中可以有多个异常类型,写成元组的形式。

    try:
       "要执行的语句块"
    except (ValueError,IndexError):
       print("我是谁?我在哪?")

    万能异常Exception ,不经常使用,会导致虽然不报错,但程序功能无法实现。

    try:
       "要执行的语句块"
    except Exception:
       print("所有错误都是Exception的子类")

    可以通过给异常取别名来获取异常信息:

    try:
       a = int("wer")
    except Exception:
       print("所有错误都是Exception的子类")
           
    try:
       a = int("wer")
    except Exception as e:
       print(e)

    输出结果分别为:
    所有错误都是Exception的子类

    invalid literal for int() with base 10: 'wer'  

    先捕获能够明确的异常类型,最后捕获万能异常类型

    try:
       print('start.....')
       l=[]
       l[3]
       print('end....')
    except NameError as e:
       print('NameError: ',e)

    except KeyError as e:
       print('KeyError: ',e)

    except Exception as e:
       print('万能异常---》',e)

    print('other.....')
    输出结果为:
    start.....
    万能异常---list index out of range
    other.....

     

    try....else... else: 不能单独使用,必须与except连用,else的子代码块会在被检测的代码没有出现过任何异常的情况下执行。else语句块要放到最后。

    try:
       print('start.....')
       print('end....')
    except NameError as e:
       print('NameError: ',e)

    except Exception as e:
       print('万能异常---》',e)
    else:
       print('在被检测的代码块没有出现任何异常的情况下执行')
    print('other.....')

    输出结果:
    start.....
    end....
    在被检测的代码块没有出现任何异常的情况下执行
    other.....

    try...finally... 无论发不发生异常,finally内的子代码块都会执行。 finally的子代码块通常用于回收系统资源

    import io
    try:
       print("start")
       f = open("1220test","rt",encoding="utf-8")
       f.read()
       print("end")
    except FileNotFoundError:
       print("文件路径错误...")
    except io.UnsupportedOperation:
       print("文件不能被写入....")
    finally:
       f.close()
    print(f.closed)  # 验证文件是否关闭
    输出结果:
    start
    end
    True

    正确使用异常: 1、如果明确知道异常发生的原因,就不要产生异常,使用if判断等条件 2、不知道异常发生的原因,但是知道异常的类型,那就明确捕获该类型的异常 3、不知道发生的原因,也不知道异常的类型,可以使用万能异常,但是一定要打印异常信息。

     

    主动抛出异常:

    try:
       raise TypeError('类型错误')
    except Exception as e:
       print(e)
       
    输出结果:
    类型错误

     

    自定义异常类:

    # 自定义异常类:

    class LoginException(Exception):
       pass

    def login():
       name = input("name:").strip()
       pwd = input("password:").strip()
       if name == "aaa" and pwd == "123":
           print("登陆成功!")
       else:
           raise LoginException("用户名或密码不正确")

    login()


    class EgonException(BaseException):
       def __init__(self,msg):  # 初始化
           self.msg=msg
       def __str__(self): # 打印对象时就会调用这个方法
           return self.msg  # 返回字符串

    try:
       raise EgonException('类型错误')
    except EgonException as e:
       print(e)
    二、assert

    assert 断言。 用来简化代码,后接布尔值表达式,如果为真则执行下面的代码;如果为假则直接抛出异常。 局限性:异常类型是固定的,且不能指定异常信息。

     

    names = ["张三","李四","王麻子"]
    # 一定要保证列表中有数据需要被处理
    if not names:
       raise TypeError("没有数据需要处理....")

    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    输出结果:
    正在处理这堆数据....
    正在处理这堆数据....
    正在处理这堆数据....



    names = []
    # 一定要保证列表中有数据需要被处理
    if not names:
       raise TypeError("没有数据需要处理....")

    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    输出结果:
    Traceback (most recent call last):
     File "C:/Users/wangt/PycharmProjects/20181220/1220test.py", line 188, in <module>
       raise TypeError("没有数据需要处理....")
    TypeError: 没有数据需要处理....
       
       
       
    assert 1  # 即断言为真

    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    输出结果:
    正在处理这堆数据....
    正在处理这堆数据....
    正在处理这堆数据....



    assert 0  # 即断言为真

    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    print("正在处理这堆数据....")
    Traceback (most recent call last):
     File "C:/Users/wangt/PycharmProjects/20181220/1220test.py", line 184, in <module>
       assert 0
    AssertionError

     

    三、网络编程之网络协议

    网络编程:编写基于网络的应用程序的过程称为网络编程。

    C/S构架 :我们把提供数据的一方称之为服务器(Server),把访问数据的一方称为客户端(Client)。

    网络连接需要两个基本要素:物理连接介质,通讯协议。

     

    osi七层模型:

    ①物理层:包括光缆等。

    作用是:基于电子器件发送电流信号,根据电流的高低可以对应到数字0和1,也就是二进制数据。

    ②数据链路层

    由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思。

    以太网协议规定如下:

    一组电信号构成一个数据包,叫做‘帧’。

    每一数据帧分成:报头head和数据data两部分。

    每台计算机都有一个世界唯一的mac地址。

     

     

  • 相关阅读:
    GIT非常见命令使用笔记
    视频封转类
    IOS ASIFormDataRequest使用简介(2/25)
    开发中常用的宏
    数据库使用fmdb
    毕业五年决定你的命运-----值得所有不甘平庸的人看看
    关于路径的使用,assi下载和
    关于图片处理的方法整理
    iOS开发之Objective-C与JavaScript的交互(转载)
    IOS UIWebView引用外部CSS样式(转载)
  • 原文地址:https://www.cnblogs.com/realadmin/p/10150171.html
Copyright © 2020-2023  润新知