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地址。

 

 

原文地址:https://www.cnblogs.com/realadmin/p/10150171.html