作为一个合格的程序员,在编程的时候一定要意识到一点,就是永远不要相信你的用户,把用户定位成黑客,这样自己写出来的代码才能够更稳定,更健壮。
python提供的异常处理机制,当异常出现的时候即使捕获,并从内部自我消化掉。
知道了以上出现的集中异常错误不用捉急,可以通过异常捕获来进行处理。
异常捕获可以使用try语句来实现,任何出现在try语句范围内的异常都会被及时捕获到。try语句有两种实现形式:
1. try-except
2. try-finally
def testException():
file = open("这是一个不存在的文件.txt")
print(file.read(-1))
file.close()
testException()
# 会出现 FileNotFoundError: [Errno 2] No such file or directory: '这是一个不存在的文件.txt' 异常
# 异常处理
def doException():
try:
file = open("这是一个不存在的文件.txt")
print(file.read(-1))
file.close()
except FileNotFoundError as reason :
print("发生了FileNotFoundError异常")
doException()
# 输出
# 发生了FileNotFoundError异常
多异常处理:可以定义多个except来处理不同的异常情况
def doException():
try:
file = open("这是一个不存在的文件.txt")
print(file.read(-1))
file.close()
except (FileNotFoundError,TypeError) as reason :
print("发生了FileNotFoundError或者TypeError异常")
doException()
# 输出
# 发生了FileNotFoundError或者TypeError异常
def doException():
try:
file = open("这是一个不存在的文件.txt")
print(file.read(-1))
file.close()
except :
print("发生了异常")
doException()
# 输出
# 发生了异常
通常不建议这么处理异常,因为他会隐藏所有程序员未想到并且为做好处理准备的错误
为了实现就算发生异常,但也不得不执行的收尾工作,可以使用try-except-finally语法处理。
eg:上述示例稍加修改
def doException():
try:
f = open("这是一个不存在的文件.txt")
print(f.read())
sum = 1 + '1'
except:
print("发生了异常")
finally:
f.close()
doException()
python也可以自己排除一个异常
raise ZeroDivisionError("除数不能为零")
在Python中else语句不仅能跟if搭配,还可以循环语句(for、while),也能够跟异常处理进行搭配
if else搭配
if 条件:
条件为真执行
else:
条件为假执行
for else、while else
else可以跟for和while循环语句配合使用,但else语句块只在循环完成之后执行,也就是说,如果循环中间使用break语句跳出循环,那么else里边的内容就不会执行了
def doForElse():
num = int(input("请输入一个数:"))
count = num // 2
while count > 1:
if num % count == 0:
print("%d 最大的约数是 %d" % (num,count))
break
count -= 1
else:
print("%d 是素数" % num)
doForElse()
这个小程序要求用户输入的数的最大约数,如果是素数的话就提醒”某某是素数“
要是用地板除法(count = num // 2),否则会出现错误,for语句的用法跟while一样
else还能跟try-except进行搭配,实际跟循环语句搭配差不多:只要try语句块里没有出现异常,就会执行else语句块里的内容
def doTryElse():
try:
int('123a')
except:
print('出现异常了')
else:
print('没有任何异常')
doTryElse()
# 输出是 出现异常了
# 将int('123a') 给成 int('123') 输出是 没有任何异常
Python提供了一个with语句,利用这个语句抽象出文件操作中频繁使用的try/except/finally相关的细节。对文件使用with可以大大减少代码量,而且不用关心文件IO是否未关闭的问题-with会自动帮助我们关闭
改写之前的代码:
def doWith():
try:
with open("这是一个不存在的文件.txt") as f:
for each_line in f:
print(each_line)
print(f.read())
sum = 1 + '1'
except OSError as reason:
print(str(reason))
doWith()