为了保证程序运行的稳定性,错误应该被程序捕捉并合理控制
try:
n = eval(input("请输入一个数字:"))
print("输入数字的3次方值为:", n ** 3)
except:
print("输入错误,请输入一个数字!")
请输入一个数字:abc
输入错误,请输入一个数字!
try:
for i in range(4):
print(10 / i, end="")
except:
print("某种原因,出错了!")
某种原因,出错了!
在except后指明错误类型
try:
for i in range(5):
print(10/i, end="")
except ZeroDivisionError:
print("除数为零,产生了除零错误!")
except:
print("某种原因,出错了!")
编写程序中,建议在输入合规性判断、保证关键代码可靠性等方面广泛使用异常处理机制。
版本1:
import random
target = random.randint(1, 10)
count = 0
while True:
guess = eval(input("请输入一个整数:"))
count += 1
if guess > target:
print("猜大了")
elif guess < target:
print("猜小了")
else:
print("猜对了")
break
print("此轮的猜测次数是:", count)
如果用户输入非数字,会产生运行错误,接着程序退出。为了增加程序鲁棒性,需要增加异常处理机制。
版本2:
import random
target = random.randint(1, 10)
count = 0
while True:
try:
guess = eval(input("请输入一个猜测的整数:"))
except:
print("输入有误,请重试,不计入猜测次数哦")
continue
count += 1
if guess > target:
print("猜大了")
elif guess < target:
print("猜小了")
else:
print("猜对了")
break
print("此轮的猜测次数是:", count)
import math
a = math.log(1000, 2)
print(a)
9.965784284662087
版本2的测试:
请输入一个猜测的整数:500
猜小了
请输入一个猜测的整数:750
猜小了
请输入一个猜测的整数:875
猜大了
请输入一个猜测的整数:812.5
猜大了
请输入一个猜测的整数:781.25
猜小了
请输入一个猜测的整数:796.87
猜大了
请输入一个猜测的整数:789.06
猜小了
请输入一个猜测的整数:793
猜大了
请输入一个猜测的整数:791
猜小了
请输入一个猜测的整数:792
猜对了
此轮的猜测次数是: 10
一个正常运行的case:
def example(x, y):
return x[y]
x = "abc"
print(example(x, 2))
输出:
c
修改后,运行报错退出运行:
Traceback (most recent call last):
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 4, in <module>
print(example(x, 4))
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 2, in example
return x[y]
IndexError: string index out of range
第一: try不仅捕获异常,而且会恢复执行
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except:
print("got exception")
print("程序出错,请修改")
test()
输出:
got exception
程序出错,请修改
第二:无论try是否发生异常,finally是无论是否捕捉到异常都会被执行,finally 可以单独和try搭配,也可以和except,包括else一起配合使用。
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except:
print("got exception")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test()
输出:
got exception
这是finally语句块
程序出错,请修改
第三:try无异常,才会执行else
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except:
print("got exception")
else:
print("这是else语句块")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test() #程序异常,不会执行else语句块
输出:
got exception
这是finally语句块
程序出错,请修改
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 2))
except:
print("got exception")
else:
print("这是else语句块")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test() #程序正常,输出else语句块
输出:
c
这是else语句块
这是finally语句块
程序出错,请修改
else作用:没有else语句,当执行完try语句后,无法知道是没有发生异常,还是发生了异常并被处理过了。通过else可以清楚的区分开。
第四:利用raise传递异常
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except:
print("got exception")
raise
else:
print("这是else语句块")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test()
输出:
Traceback (most recent call last):
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 17, in <module>
test()
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 7, in test
print(example(x, 4))
File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 2, in example
return x[y]
IndexError: string index out of range #正常执行语句同时可以捕获异常
got exception
这是finally语句块
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except IndexError: #指定只有IndexError才会执行except语句
print("got exception")
else:
print("这是else语句块")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test()
输出:
got exception
这是finally语句块
程序出错,请修改
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except (TypeError, IndexError): #指定两个异常类型
print("got exception")
else:
print("这是else语句块")
finally:
print("这是finally语句块")
print("程序出错,请修改")
test()
输出:
got exception
这是finally语句块
程序出错,请修改
第六、注意:不建议在finally语句块中使用return语句
def example(x, y):
return x[y]
x = "abc"
def test():
try:
print(example(x, 4))
except :
print("got exception")
print(1 / 0) #因为finally里的return,except里的这个异常不会打印出来
finally:
print("这是finally语句块")
return 10
print("程序出错,请修改") #因为finally里的return,这个print不会打印出来
test()
输出:
got exception
这是finally语句块
PS: for reference, python123.io