Python异常
-
作用
用作信号通知,通知上层调用者有错误产生需要处理
1. try 语句
- 语法
try:
可能发生异常的语句块
except 错误类型1 [as 变量名1]:
异常处理语句块1
except 错误类型2 [as 变量名2]:
异常处理语句块2
...
except 错误类型n [as 变量名n]:
异常处理语句块n
except:
异常处理语句块other
else:
未发生异常的语句
finally:
最终的处理语句
-
作用
尝试捕获异常,得到异常通知,将程序由异常状态变为正常状态
-
说明
except 子句可以有 1个或多个
except: 不给错误类型,可以匹配全部的错误类型
else 子句里的语句会在 没有错误发生时执行,当处于异常时不执行
finally 子句里的语句,无论何时都执行
-
示例
try:
x = int(input("请输入一个整数:"))
print('x=', x)
except ValueError:
print('您的输入不能转成整数')
print("程序结束")
2. raise 语句
-
问题
# 写一个函数, get_score 函数,读取用户输入的整数成绩, # 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间 # 报 ValueError类型的错误 def get_score(): x = int(input('请输入成绩:')) if 0 <= x <= 100: return x raise ValueError
-
语法
raise 异常类型 或 raise 异常对象
-
作用
- 抛出一个错误,让程序进入异常状态
- 发送错误通知给调用者
-
示例:
## 写一个函数, get_score 函数,读取用户输入的整数成绩,
## 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间
## 报 ValueError类型的错误
def get_score():
x = int(input('请输入成绩:'))
if 0 <= x <= 100:
return x
# raise ValueError
raise ValueError('用户输入的成绩不在 0~100 之间')
try:
score = get_score()
print(score)
except ValueError as err:
print("成绩输入有误 err=", err)
err的作用就是接收raise ValueError(‘用户输入的成绩不在 0~100 之间’)给出的提示信息
-
异常类型的可选种类
详见:
>>> help(__builtins__)
-
课后练习1
写一个猜拳游戏: 石头,剪刀,布, 让电脑随机生成一个, 你的输入如下: 0) 石头 1) 剪刀 2) 布 q) 退出 请选择: 0 电脑出的是 布 ,你输了 循环输入,知道输入q 为止
参考答案1
import random import time signal = ['石头', '剪刀', '布'] def show_menu(): print(" 0) 石头 ") print(" 1) 剪刀 ") print(" 2) 布 ") print(" q) 退出 ") def begin_compare(computer, your): comp_s = signal[computer] # 电脑的字符串 your_s = signal[your] print('电脑出的是', comp_s, '你出的是', your_s) if comp_s == your_s: print('平局!') elif comp_s == '石头': if your_s == '剪刀': print('你输了!') elif your_s == '布': print('你赢了!') elif comp_s == '剪刀': if your_s == '布': print('你输了!') elif your_s == '石头': print('你赢了!') elif comp_s == '布': if your_s == '石头': print('你输了!') elif your_s == '剪刀': print('你赢了!') # time.sleep(5) input('请输入回车键,继续下一次猜拳:') def run(): '''开始猜拳游戏''' while True: show_menu() s = input('请选择:') if s == 'q': break your = int(s) # 你的选项 computer = random.randint(0, 2) begin_compare(computer, your) if __name__ == '__main__': run()
参考答案2
import random import time signal = ['石头', '剪刀', '布'] result = ['平局!', '你赢了!', '你输了!'] # 0 1 -1 # 定义一个二维列表, 行代表 电脑的选择, 列代表我的选择 map = [ # 用户: 0 1 2 [ 0, -1, 1], # 电脑出的是0---> 石头 [ 1, 0, -1], # 电脑出的是1---> 剪刀 [-1, 1, 0], # 电脑出的是2---> 布 ] def show_menu(): print(" 0) 石头 ") print(" 1) 剪刀 ") print(" 2) 布 ") print(" q) 退出 ") def begin_compare(computer, your): comp_s = signal[computer] # 电脑的字符串 your_s = signal[your] print('电脑出的是', comp_s, '你出的是', your_s) result_index = map[computer][your] r = result[result_index] print(r) # time.sleep(5) input('请输入回车键,继续下一次猜拳:') def run(): '''开始猜拳游戏''' while True: show_menu() s = input('请选择:') if s == 'q': break your = int(s) # 你的选项 computer = random.randint(0, 2) begin_compare(computer, your) if __name__ == '__main__': run()
-
课后练习2
写一个猜数字游戏 让电脑随机生成一个 0 ~ 100 的整数让用来猜 如果 您输入的数大于电脑生产的数,提示:“您猜大了”, 继续猜 如果 您输入的数小于电脑生产的数,提示:“您猜小了”, 继续猜 当 您输入的数等于电脑生产的数,提示:"恭喜您猜对了" 打印猜的次数后退出程序
参考答案
import random def run(): # 1. 让电脑生成一个整数,用 x 变量绑定 x = random.randint(0, 100) count = 0 # 记次数 while True: y = int(input('请输入: ')) count += 1 if y > x: print('您猜大了!') elif y < x: print('您猜小了!') else: print('恭喜您猜对了!') break print('您共猜了', count, '次') if __name__ == '__main__': run()
3.Python全部的错误类型
错误类型 | 说明 |
---|---|
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
ValueError | 传入无效的参数 |
AssertionError | 断言语句失败 |
StopIteration | 迭代器没有更多的值 |
IndexError | 序列中没有此索引(index) |
IndentationError | 缩进错误 |
OSError | 输入/输出操作失败 |
ImportError | 导入模块/对象失败 |
NameError | 未声明/初始化对象 (没有属性) |
AttributeError | 对象没有这个属性 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
TypeError | 对类型无效的操作 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
OverflowError | 数值运算超出最大限制 |
FloatingPointError | 浮点计算错误 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
Exception | 常规错误的基类 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
WindowsError | 系统调用失败 |
LookupError | 无效数据查询的基类 |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError Python | 语法错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
以下为警告类型 | |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
详见:help(builtins)
课后练习
写一个函数 get_age() 用来获取一个人的年龄信息
此函数规定用户只能输入1~140之间的整数,如果用户输入其它的数则直接触发ValueError类型的错误!
def get_age():
...
try:
age = get_age()
print("用户输入的年龄是:", age)
except ValueError as err:
print("用户输入的不是1~140的整数,获取年龄失败!")
参考答案
def get_age():
age = int(input('请输入: '))
if age < 0 or age > 140:
raise ValueError("年龄范围错误")
return age
Python文件操作
文件操作是Python中常见的任务之一,用于创建、读取、写入和管理文件。以下是一些常见的文件操作任务的思路、总结和示例代码:
1. 打开文件
要执行文件操作,首先需要打开文件。使用open()
函数可以打开文件,指定文件名以及打开模式(读取、写入、追加等)。
![图片描述](.\img\图片20240723153414.png)
# 打开一个文本文件以读取内容
file = open("example.txt", "r")
2. 读取文件
一旦文件被打开,可以使用不同的方法来读取文件内容。
![图片描述](.\img\图片20240723153548.png)
# 读取整个文件内容
content = file.read()
# 逐行读取文件内容
for line in file: #直接遍历文件对象,每次读取一行。这种方式更内存友好,因为不需要将所有行读入内存。
print(line)
with open('example.txt', 'r') as file:
lines = file.readlines() # 读取文件的所有行,并将其作为一个列表返回。
for line in lines:
print(line, end='') 代码和file = open("example.txt", "r")for line in file:
print(line) 代码的区别
3. 写入文件
要写入文件,需要打开文件以写入模式(‘w’),然后使用write()
方法。
# 打开文件以写入内容
file = open("example.txt", "w")
# 写入内容
file.write("这是一个示例文本。")
4. 关闭文件
完成文件操作后,应该关闭文件,以释放资源和确保文件的完整性。
file.close()
5. 使用with
更安全的方法是使用with
语句,它会自动关闭文件。
with open("example.txt", "r") as file:
content = file.read()
# 文件自动关闭
6. 检查是否存在
可以使用os.path.exists()
来检查文件是否存在。
import os
if os.path.exists("example.txt"):
print("文件存在")
7. 处理异常
在文件操作中,可能会出现各种异常情况,例如文件不存在或没有权限。在文件操作中捕获这些异常是个好习惯。
try:
with open("example.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("文件不存在")
except Exception as e:
print(f"发生错误:{
e}")
这些是文件操作的一些常见思路和示例代码。请根据你的具体需求和场景来调整代码。在进行文件操作时,要确保小心处理文件,以避免意外数据损坏或文件损坏。
除了打开、读取和写入文件之外,还有一些其他常见的文件操作,如复制、删除和改变文件名。以下是这些操作的思路和示例代码:
8. 复制文件
要复制文件,你可以使用shutil
模块的copy
方法。
import shutil
source_file = "source.txt"
destination_file = "destination.txt"
shutil.copy(source_file, destination_file)
9. 删除文件
要删除文件,可以使用os
模块的remove
方法。
import os
file_to_delete = "file_to_delete.txt"
if os.path.exists(file_to_delete):
os.remove(file_to_delete)
print(f"{
file_to_delete} 已删除")
else:
print(f"{
file_to_delete} 不存在")
10. 修改名称
要改变文件名,可以使用os
模块的rename
方法。
import os
old_name = "old_name.txt"
new_name = "new_name.txt"
if os.path.exists(old_name):
os.rename(old_name, new_name)
print(f"文件名已更改为 {
new_name}")
else:
print(f"{
old_name} 不存在")