8.3.1 tyr...except 结构
结构语法。
tyr:
try 块
except Exception[as reason]:
except 块
如果需要捕获所有类型的异常,可以使用 BaseException。
try:
...
except BaseException as e:
except 块
一般不建议像上面这样做,一般建议尽量显示捕获所有可能出现的异常。
代码演示。
>>> while True:
try:
x = int(input("Please enter a number:"))
break
except ValueError:
print("That was not a valid number, Try again...")
Please enter a number:e
That was not a valid number, Try again...
Please enter a number:ad
That was not a valid number, Try again...
Please enter a number:8i
That was not a valid number, Try again...
Please enter a number:9f
That was not a valid number, Try again...
Please enter a number:12
可以在 except 子句异常类后面指定一个变量,用来捕获异常的参数或更详细的信息。
>>> try:
raise Exception('spam', 'eggs')
except Exception as inst:
print(type(inst))
print(inst.args)
print(inst)
x, y = inst.args
print('x=',x)
print('y=',y)
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x= spam
y= eggs
8.3.2 try...except...else 结构
如果 try 中的代码没有抛出任何异常,则执行 else 块中的代码。
>>> while True:
n = input('请输入字符串序号')
try:
n = int(n)
print(a_list[n])
except IndexError:
print('列表下标不正确,请重新输入')
else:
break
8.3.3 带有多个 except 的 try 结构
一旦某个 except 捕获了异常,则后面剩余的 except 子句将不会再执行。
>>> try:
x = input('请输入被除数')
y = input('请输入除数')
z = float(x) / float(y)
except ZeroDivisionError:
print('除数不能为0')
except TypeError:
print('被除数和除数应为数值类型')
except NameError:
print('变量不存在')
else:
print(x, ' / ', y, ' = ', z)
8.3.4 try...except...finally 结构
finally 子句的语句块无论是否发生异常都会执行,常用来做一些清理工作和释放资源。
>>> try:
3/0
except:
print(3)
finally:
print(5)
3
5
再比如下面代码,无论读取文件是否发生异常,总是能够正常关闭文件。
>>> try:
f = open('sample.txt', 'r')
line = f.readline()
print(line)
finally:
f.close()
中国山东烟台 SDIBT
如果 try 子句的异常没有被捕获和处理,或者 except 子句或 else 子句 发生了异常,那这些异常会在 finally 子句执行完后再次抛出。
>>> def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result = ", result)
finally:
print("executing finally clause")
>>> divide(2, 1)
result = 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
TypeError: unsupported operand type(s) for /: 'str' and 'str'
另外,finally 子句也会发生异常。
>>> try:
f = open('sample.txt', 'r')
line = f.readline()
print(line)
finally:
F.close()
中国山东烟台 SDIBT
Traceback (most recent call last):
File "<pyshell#80>", line 6, in <module>
F.close()
NameError: name 'F' is not defined
应避免在 finally 子句中使用 return 语句。
>>> def demo_div(a, b):
try:
return a / b
except:
pass
finally:
return -1
>>> demo_div(1, 0)
-1
>>> demo_div(1, 2)
-1