目录
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()
go 异常处理
Go 推崇“错误即正常”的理念,通过返回错误值来表示函数调用是否成功,并使用一些约定的方式对错误进行处理。
Go 语言的异常处理模式主要涉及以下几个关键点:
错误类型:在 Go 中,错误类型是一个实现了
error
接口的对象。通常,函数在遇到错误时会返回一个错误对象作为结果。如果函数执行成功,错误对象为nil
;否则,错误对象将包含有关错误的相关信息。错误返回:Go 函数可以通过多个返回值来返回错误。一般约定将错误作为最后一个返回值。
错误检查:在调用返回错误的函数后,需要检查错误是否为
nil
,以确定函数调用是否成功。通常使用if err != nil
进行判断,如果错误不为nil
,则说明发生了错误。错误处理:一旦发现错误,可以根据具体情况选择适当的处理方式。处理方式可以是记录日志、终止程序、返回默认值或者尝试其他恢复措施等。
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.
文件内容:<nil>
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 <nil>
如果是非常严重的错误,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