异常处理
通过编程捕获异常并处理是可行的
while True:
try:
num = int(input("请输入一个数值:"))
print("您输入的数值是:", num)
break
except ValueError:
print("您输入的不是合法的数据,请重新输入。")
try 语句按如下方式工作:
• 首先,执行 try 子句(在 try 和 except 关键字之间的部分)。如果没有异常发生,except 子句在 try 语句执行完毕后就被忽略了。
• 如果在try子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。
• 如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的except子句。然后继续执行 try 语句之后的代码。
• 如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。
• 如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息。
• 一个try语句可能包含多个except子句,分别指定处理不同的异常。至多只会有一个分支被执行。
• 异常处理程序只会处理对应的try子句中发生的异常,在同一个try语句中,其他子句中发生的异常则不作处理。
• 一个except子句可以在括号中列出多个异常的名字,例如:
except (RuntimeError, TypeError, NameError):
pass
最后一个except子句可以省略异常名称,以作为通配符使用。还是需要慎用此法,因为它会轻易隐藏一个实际的程序错误!可以使用这种方法打印一条错误信息,然后重新抛出异常(允许调用者处理这个异常),程序代码如下所示:
try:
1/0
[0][10]
except(ValueError,IndexError,ZeroDivisionError) as e:
print(e)
except Exception as e:
print(e)
异常处理流程:
try:
# 这行代码可能产生FileNotFoundError异常
f = open("foo.txt", "r")
line = f.readline()
# 这行代码可能产生IndexError异常
print(line[200])
except FileNotFoundError:
# 如果发生FileNotFoundError异常则由这个代码块来处理
print("找不到指定的文件")
except IndexError:
# 如果发生IndexError异常则由这个代码块来处理
print("索引越界")
except Exception as e:
# args是异常对象的参数
print(e.args)
else:
# try代码块没有抛出异常,则执行这个代码块
print("读取文件成功")
finally:
# 无论try代码块是否抛出异常,都会执行这个代码块
f.close()
抛出异常:
raise NameError('HiThere')
自定义异常:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
try:
raise MyError(2 * 2)
except MyError as e:
print("My exception occurred, value:", e.value)