异常
异常介绍?
- 程序的错误有两种
- 代码错误
- 代码正常, 运行的时候报错, 这个叫异常
a = int(input("请输入一个整数"))
- 程序不应该因为异常而非法终止, 发生异常的时候, 程序是可控的
捕捉异常
- 发生异常, 如果不捕捉, 程序会因为异常而意外报错终止
- 一个异常一旦被捕捉到, 那么就不会因为异常而报错终止了
try:
可能产生异常的代码
except:
发生异常会执行的代码, 如果没有异常, 这里的代码不会执行
try:
a = int(input("请输入一个整数"))
except:
print("输入的数字非法")
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except:
print("异常发生")
捕获指定异常
try:
可能发生异常的代码
except 异常类型1:
发生异常类型1要执行的代码
except 异常类型2:
发生异常类型2要执行的代码
except 异常类型n:
发生异常类型n要执行的代码
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除数不能为0")
'''
ValueError 值错误异常
ZeroDivisionError 除数为0的异常
'''
捕捉未知异常
try:
可能发生异常的语句
except Exception as e:
发生要执行代码, 如果要想显示异常描述, 可以用print把e的内容输出
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except Exception as e:
print(f"异常发生:{e}")
捕获指定异常与捕获未知异常
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除数不能为0")
except Exception as e:
print(f"未知异常{e}")
捕捉异常的完整语句
try:
可能发生异常的代码
except 异常类型1:
发生异常类型1执行的代码
except 异常类型n:
发生异常类型n执行的代码
except Exception as e:
发生未知异常执行的代码
else:
没有发生异常执行的代码
finally:
无论是否有异常, 都要执行的代码
try:
a = int(input("请输入一个整数"))
b = int(input("请输入一个整数"))
print(a / b)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除数不能为0")
except Exception as e:
print(f"未知异常{e}")
else:
print("没有任何异常发生")
finally:
print("无论是否有异常, 都会执行的代码")
异常的传递
- 一个函数内部代码发生异常, 如果函数内部没有用try捕捉这个异常, 这个异常会传递给函数的调用者
- 函数内部的异常, 函数的调用者也可以捕捉
- 函数内部的异常, 所有的调用者如果都没有捕捉,最后会导致异常出错终止
class A:
def my_func1(self):
try:
print(1 / 0)
except:
print("异常发生")
def my_func2(self):
self.my_func1()
a = A()
a.my_func2()
class A:
def my_func1(self):
print(1 / 0)
def my_func2(self):
try:
self.my_func1()
except:
print("异常发生")
a = A()
a.my_func2()
class A:
def my_func1(self):
print(1 / 0)
def my_func2(self):
self.my_func1()
a = A()
try:
a.my_func2()
except:
print("异常发生")
抛出异常
raise Exception("异常的描述")
- 使用raise代码自己抛出的异常, 如果不用try捕捉, 同样会异常报错终止
try:
raise Exception("自己抛出的异常")
except Exception as e:
print(f"发生异常, 异常的描述为{e}")
'''
password = input("请输入密码")
if password == "123456":
print("正确")
else:
print("错误")
'''
password = input("请输入密码")
try:
if password != "123456":
raise Exception("错误")
except Exception as e:
print(e)
else:
print("正确")
案例-判断手机号码格式是否正确
'''
用户输入手机号码, 判断号码是否正确
手机号码规则
1 纯数字组成
2 长度11位
3 第一位是1
4 第二位大于2
如果收入的手机号码格式正确, 显示正确, 如果不正确显示具体的错误原因
'''
mobile = input("请输入手机号码")
try:
int(mobile)
if len(mobile) != 11:
raise Exception("手机号码必须是11位")
if mobile[0] != "1":
raise Exception("手机号码第一位必须为1")
if int(mobile[1]) <= 2:
raise Exception("手机号码第二位必须大于2")
except ValueError:
print("手机号码必须为纯数字组成")
except Exception as e:
print(e)
else:
print("手机号码格式正确")
文件读写
文件的类型
- 文本文件
- 二进制文件
- 只要不是文本文件, 就是二进制文件
- 各种图像, 声音, 还有各种可执行程序都是二进制
操作文件的步骤
一个读文件的例子
file = open(r"c:\file\a.txt", "r")
txt = file.read()
file.close()
print(txt)
- 读文件的时候看到异常UnicodeDecodeError, 代表不知道文件的字符集是什么, 所以读取不到内容
读取带有中文的文件
- open打开文件的时候, 要指定文件的字符集
- 常见的中文字符集
file = open("文件路径文件名", "r", encoding="utf-8")
file = open(r"03-异常.py", "r", encoding="utf-8")
txt = file.read()
file.close()
print(txt)
file = open(r"c:\file\b.txt", "r", encoding="gbk")
txt = file.read()
file.close()
print(txt)
- read的功能是, 执行一次, 就把文件所有的内容读取到一个变量中
readline按行读取文件内容
- 调用readline一次读一行
- 第二次调用readline自动会读取文件的下一行
- 如果已经读取到文件最后readline返回""
file = open(r"c:\file\c.txt", "r", encoding="gbk")
while True:
txt = file.readline()
if txt == "":
break
print(txt, end="")
file.close()
file = open(r"c:\file\c.txt", "r", encoding="gbk")
line_num = 1
while True:
txt = file.readline()
if txt == "":
break
print(f"{line_num}:\t{txt}", end="")
line_num += 1
file.close()
写文件
file = open(r"c:\file\d.txt", "w", encoding="gbk")
file.write("hello world")
file.close()
"w"
- write的首字母, 写文件 如果目标文件不存在, 新建一个文件, 如果目标文件存在, 就覆盖已有内容
"a"
- append的首字母, 追加写文件, 如果目标文件不存在, 新建一个文件, 如果目标文件存在, 在已有内容后面追加内容
file = open(r"c:\file\a.txt", "a", encoding="gbk")
file.write("是的冯绍峰的是发\n")
file.close()
open打开文件的几种模式
"r"
- 读文本文件---- 读取的文件一定要存在, 否则会抛出异常FileNotFoundError
- 一个文件用r打开, 就只能读, 不能写入内容
"w"
- 写文本文件 ---- 如果文件不存在, 创建新文件, 如果文件存在, 覆盖已有文件内容
- 一个文件用w打开, 就只能写, 不能读取内容
"a"
- 追加写文件 ----- 如果文件不存在, 创建新文件, 如果文件存在, 在已有内容后面追加
- 一个文件用a打开, 就只能写, 不能读取内容
"rb"
"wb"
"ab"
读写文件的注意项
- 以读方式打开的文件, 不能写入内容
- 以写方式打开的文件, 不能读取内容
- 下面的两个代码案例, 都是错误的
'''
file = open(r"c:\file\a.txt", "r", encoding="gbk")
file.write("aaaaaaa") # r方式打开的文件, 只能读取内容
file.close()
'''
'''
file = open(r"c:\file\a.txt", "w", encoding="gbk")
txt = file.read() # w方式打开的文件, 只能写入内容
file.close()
'''
总结

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律