Python-Go 文件操作和异常操作

目录

python的异常操作

异常是什么?

错误与异常的区别:

常见异常

Traceback 错误回溯 

异常处理

异常处理的定义(try - except)

扩展(可以捕获不同的错误、多except语句)(else - finally的使用)

finally分支存在的意义是什么

raise 触发异常

python的文件操作

打开文件-关闭文件

open(参数1:文件名,参数2:打开方式(可读可写,只读,只写),参数3:编码方式)

打开方式:r、rw、w、a、r+

读取文件内容的方式:readlines()、read()、readline()

在文件操作中添加异常处理(try: except)

with 打开文件的方式 --》with语句执行完毕,自动关闭文件

练习一: 从键盘接收10行数据,以行为单位写入到文件test2.txt中

练习二:通过ip请求淘宝的一个接口获取到省份和运营商

go 异常处理 

GO中的两种异常:Error、Panic

error示例一:

使用 if err != nil 进行判断(error类型),然后对异常进行处理

error示例二:

如果是非常严重的错误,Panic(恐慌)

defer进行异常处理

Panic示例:


python的异常操作

异常是什么?

异常是指意外或错误的事件,可能导致程序中断、崩溃或产生不可预测的结果。

错误与异常的区别:

错误是 --》代码执行过程中出现了一些Error,导致代码中断

语法错误 => 可预知(错误是可预知的)

异常是  => 代码执行的过程中出现不可预期的错误

异常处理的目的是如果出错了,不退出程序,继续运行程序

常见异常

# a = 1
# b = 0
# c = a/b
# 错误:ZeroDivisionError: division by zero(被除数不能为0)

# a:
# SyntaxError: invalid syntax(语法错误)

#  a = 1
# b = 1
# IndentationError: unexpected indent (缩进错误)

# li = [1,2,3,4]
# print(li[8])
# IndexError: list index out of range(列表超出范围)

# dic = {}
# print(dic["a"])
# KeyError: 'a'(a这个key是不存在的)

Traceback 错误回溯 

Traceback 错误回溯是 Python 解释器在程序发生异常时所提供的一种错误信息展示方式。当程序抛出异常但没有被捕获和处理时,Python 解释器会显示 Traceback 错误回溯信息以帮助开发者定位和调试错误。

异常处理

异常处理的定义(try - except)

#程序捕获错误,自己处理
try:
    # 可能会出现异常的代码
    fp = open("test.txt")
    print("代码结束")

#出现异常情况,执行except
#except 捕获所有异常
except :
    # 如果出错了,就会执行except部分
    print("不好意思,出错了")

#打印具体的错误信息是什么
# Exception 异常(Exception)是指在程序执行过程中遇到的所有意外或异常情况,可以表示所有的异常
except Exception as ex:
    # 如果出错了,就会执行except部分
    print("不好意思,出错了", ex)

扩展(可以捕获不同的错误、多except语句)(else - finally的使用)

# 可以根据错误的类型分别捕获不同的错误
# 多个except语句分别捕获不同的错误类型
# 从前到后匹配,如果匹配到一个,就会直接退出
# 父类错误类型(Exception)需要写到子类错误类型(ValueError)的后面

# 可以根据错误的类型分别捕获不同的错误
# 多个except语句分别捕获不同的错误类型
# 从前到后匹配,如果匹配到一个,就会直接退出
# 父类错误类型(Exception)需要写到子类错误类型(ValueError)的后面
try:
    print("start....")
    1/0
    int("abc")
    a = [1,2,3]
    a[10]
# 捕获 ValueError
except ValueError as ex:
    print("int函数只能接收int字符串", ex)
# 捕获 ZeroDivisionError
except ZeroDivisionError as ex:
    print("被除数不能为0", ex)
# 捕获任意错误 Exception
except Exception as ex:
    print("出错了", ex)

# 如果try没有出错,就会执行else分支
else:
    print("代码没有出现任何错误")

# 不管try部分是否出错,finally都会执行
finally:
    print("不管try部分是否出错,我都会执行")
# finally分支存在的意义是什么

finally分支存在的意义是什么

不管try部分是否出错,finally都会执行

# (比如说你打开文件的时候,出现错误了,但是except里面没有关闭文件,因此你需要使用finally来最后关闭文间)

def funcd():
    #开辟了一个上下文空间
    try:
        print("start")
        print("这里打开了一个文件")
        #错误
        1/0
    except:
        print("出错了")
        return False
    finally:
        print("关闭文件")
funcd()

raise 触发异常

# raise 触发异常
def funcf(idcard):
    try:
        # 接收一个身份证号码,返回生日
        if len(idcard) != 11:
            #添加触发异常(自定义函数的时候,遇到了不合法的参数,并且计算出现异常了,导致无法正确给出返回结果)
            raise ValueError("身份证号码不合法")
            #可以触发异常
        else:
            return idcard[6:14]
    except ValueError as ex:
        print("出现ValueError异常,异常是:", ex)

birthday = funcf("123413123")
print("你的生日是:",birthday)

python的文件操作

打开文件-关闭文件

open(参数1:文件名,参数2:打开方式(可读可写,只读,只写),参数3:编码方式)

打开方式:r、rw、w、a、r+

读取文件内容的方式:readlines()、read()、readline()

# r --》读
# w --》写 (如果文件不存在,它会帮助我们创建一个新文件,如果文件存在,它会清空原来文件的内容,添加新内容)
# rw --》读写
# a --》 追加(在文件末尾追加内容)
# r+ --》读写(如果文件不存在,它会报错,如果文件存在,它会将需要添加的数据添加到我们的光标位置,不会覆盖文件)

#参数1:文件名 参数2:打开方式(可读可写,只读,只写),参数3:编码方式
#fp --> 文件句柄
fp = open("test.txt","r",encoding="utf-8")
#读取文件内容
# 将整个文件全部读取出来
#readlines() --》以列表的方式读取出来 --》list
#从光标当前位置以列表的形式读取出来
content1 = fp.readlines()
print(type(content1), content1)
#read
#从光标当前位置开始读取文本,直到读取到末尾 --》 str
#移动文件指针(移动到文件开头)
fp.seek(0)
content2 = fp.read()
print(type(content2), content2)

#移动文件指针(移动到文件开头)
fp.seek(0)
#readline 从光标当前位置开始读取文本,每次只读取一行
line = fp.readline()
print(type(line), line)

#关闭文件
fp.close()

在文件操作中添加异常处理(try: except)

#添加异常处理(try: except)
try:
    print("打开文档")
    fp = open("test1.txt", "r", encoding="utf-8")
    content3 = fp.readlines()
    print(content3)
except FileExistsError as ex:
    print("文件不存在",ex)
except Exception as ex:
    print("出现异常", ex)
finally:
    print("关闭文档")
    fp.close()

with 打开文件的方式 --》with语句执行完毕,自动关闭文件

连接Mysql和ssh的时候使用 

示例一:

#with 打开文件的方式 --》推荐使用
#with语句执行完毕,自动关闭文件
#连接Mysql和ssh的时候使用
try:
    with open("test.txt", "r", encoding="utf-8") as fp:
        content4 = fp.readlines()
        print(content4)
except FileExistsError as ex:
    print("文件不存在",ex)
except Exception as ex:
    print("出现异常", ex)

示例二: 

import time
try:
    with open("./test1.txt", "r+", encoding="utf-8") as fp:
        # 数据写到当前文件指针的位置
        # 2=>文件末尾,0 => 移动0字节
        fp.seek(0,2)
        # fp.write的时候,数据并不会立刻写入(磁盘是慢设备,先把数据写到缓冲区)
        # 1.文件关闭 2.缓冲区满 3.代码结束
        fp.write("hello !")
        time.sleep(10)
except FileNotFoundError as ex:
    print("文件不存在 ")
except Exception as ex:
    print("未知错误")

练习一: 从键盘接收10行数据,以行为单位写入到文件test2.txt中

# 从键盘接收10行数据,以行为单位写入到文件。test2.txt
# 如果第2次执行,内容是追加到后面
# 能封装函数(类型注解),异常处理(可能会出错)
# def write_file(a:str) -> None:

# 练习:
# 从键盘接收10行数据,以行为单位写入到文件。test2.txt
# 如果第2次执行,内容是追加到后面
# 能封装函数(类型注解),异常处理(可能会出错)
# def write_file(a:str) -> None:

def write_file(filename:str) -> None:
    #异常处理
    try:
        # 打开文件 a是追加的意思
        with open(filename,"a",encoding="utf-8") as fp:
            for i in range(10):
                #输入每一行的数据
                line = input(f"请输入第{i+1}行数据:")
                #写入数据
                fp.write(line + "\n")
    except FileExistsError as ex:
        print("文件不存在", ex)
    except Exception as ex:
        print("出现异常", ex)

write_file("test1.txt")

练习二:通过ip请求淘宝的一个接口获取到省份和运营商

- 通过ip请求淘宝的一个接口获取到省份和运营商
- 接口:https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=要查询的ip地址
- 每一行变成这种形式保存到文件
- 格式:ip,中国,湖南,电信

import requests
from ipaddress import IPv4Address

"""
- 通过ip请求淘宝的一个接口获取到省份和运营商
- 接口:https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=要查询的ip地址
- 每一行变成这种形式保存到文件
- 格式:ip,中国,湖南,电信
"""

#拉取接口数据
def get_ip_info(ip):
    url = f"https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip={ip}"
    response = requests.get(url)
    # 用于将 HTTP 响应的内容解析为 JSON 格式。
    data = response.json()
    if data["code"] == 0:
        ip_info = data["data"]
        ip = ip_info["ip"]
        country = ip_info["country"]
        region = ip_info["region"]
        isp = ip_info["isp"]
        write_file(ip,country,region,isp)
    else:
        return "Request Error"

#将数据保存到文件
def write_file(ip,country,region,isp):
    try:
        with open("test.txt", "a", encoding="utf-8") as fp:
            fp.write("ip:" + ip + ",country:" + country + ",region:" + region + ",isp:" + isp + "\n")
    except FileExistsError as ex:
        print("文件不存在", ex)
    except Exception as ex:
        print("出现异常", ex)

def main():
    # 主函数的代码逻辑
    # 方法二:直接调用IPv4地址
    network  = IPv4Address('192.168.0.1')
    print(network )

    #方法一:调用多条IP地址
    ip_list = ["192.168.2.150", "192.168.2.43", "192.169.2.210"]
    for ip in ip_list:
        #运行get_ip_info
        get_ip_info(ip)

if __name__ == "__main__":
    main()

 Python-Go 文件操作和异常操作_第1张图片

go 异常处理 

Go 推崇“错误即正常”的理念,通过返回错误值来表示函数调用是否成功,并使用一些约定的方式对错误进行处理。

Go 语言的异常处理模式主要涉及以下几个关键点:

  1. 错误类型:在 Go 中,错误类型是一个实现了 error 接口的对象。通常,函数在遇到错误时会返回一个错误对象作为结果。如果函数执行成功,错误对象为 nil;否则,错误对象将包含有关错误的相关信息。

  2. 错误返回:Go 函数可以通过多个返回值来返回错误。一般约定将错误作为最后一个返回值。

  3. 错误检查:在调用返回错误的函数后,需要检查错误是否为 nil,以确定函数调用是否成功。通常使用 if err != nil 进行判断,如果错误不为 nil,则说明发生了错误。

  4. 错误处理:一旦发现错误,可以根据具体情况选择适当的处理方式。处理方式可以是记录日志、终止程序、返回默认值或者尝试其他恢复措施等。

go中,如果遇到执行结果出错的情况下,通常是通过返回值的方式告诉你。

GO中的两种异常:Error、Panic

// error (错误)=> 返不是很严重的错误,返回程序员处理

// panic (恐慌)=> 如果是非常严重的错误 => 退出 (异常处理)

error示例一:

func main()  {
	map3 := map[string]string{
		"age":"10",
		"name":"clay"}
	value, flag := map3["age3"]
	fmt.Printf("Value值为:%s, err为:%v\n", value, flag)

其中返回值为:

Value值为:, err为:false

#err为false 不为nil,表示程序出现error了

使用 if err != nil 进行判断(error类型),然后对异常进行处理

func main()  {
	//打开文件
	file, err := os.Open("test.txt")
	// nil --> 某些数据类型的零值
	// nil 是 error的零值 --》:表示没有出现错误
	//异常处理
	if err != nil{
		fmt.Printf("出错了:%v\n", err)
	}
	fmt.Printf("文件内容:%v\n", file)

}

输出:

出错了:open test.txt: The system cannot find the file specified.  
文件内容:

error示例二:

func main()  {

   	result := hello("")
	fmt.Printf("出错了:%T  %v\n", result, result)
	result =hello("cici")
	fmt.Println(result)
}

func hello(name string) error {
    //error异常如果出现
	if len(name) == 0{
		//go  --> return ValueError("name为空")
		return errors.New("name为空")
	}
	fmt.Printf("hello:%s ", name)
	return nil
}

输出:

出错了:*errors.errorString  name为空
hello:cici 

如果是非常严重的错误,Panic(恐慌)

defer进行异常处理

defer => 延迟执行 => 放要有可能出错有代码之前

derfer 后接带有recover处理的函数
//recover => 获取Panic信息

Panic示例:

func main()  {
	sil := []int{1,2,3,4,5,6}
	fmt.Println(get(sil,7))
}

func get(sil []int, index int ) int  {
    // defer进行异常处理
     recover()函数内使用
	//defer func(){
	//	//recover()捕获我们的异常信息
	//	if r:=recover();r!=nil{
	//		fmt.Println("Something error")
	//	}
	//}()
	defer myrecover()
	//传一个切片过来,它帮你返回index(索引)
	//defer 延迟执行 等函数内容执行完成后,再去执行defer,倒序执行
	fmt.Println("start....")
	defer fmt.Println("第一个defer")
	defer fmt.Println("第二个defer")
	fmt.Println("end....")
	//defer要放到可能出错的代码之前
	defer fmt.Println("第三个defer")
	return sil[index]     //可能出错的代码

}

// recover()函数外使用
func myrecover()  {
	if r:=recover();r!=nil{
		fmt.Println("Something error")
	}
}

输出:

start....
end....
第三个defer
第二个defer
第一个defer
Something error
0

你可能感兴趣的:(python,开发语言)