Python try except 语法
在 Python 中,我们可以使用 try except 语句来捕获异常或处理异常。
语法:
try:
# 需要检测的代码
except 具体异常类型 as reason:
# 出现异常后的处理代码说明:
try 语句后面接的是你认为可能会出错的代码,except 语句后面接的是出现异常后的处理代码。try 语句后面的代码块中,一旦有一句代码出现异常,则剩下的语句将不会被执行。
except 语句中,“具体异常类型” 可以是 NameError、IndexError 等。异常类型可以是一个或者多个。如果是多个,则使用元组来保存,表示对这些异常进行统一的处理。
as reason 是一个可选语句,我们可以通过 reason 这个参数来捕获异常的详细信息。此外,对于 try...except 语句,我们还可以使用多个 except 子句来处理不同的异常。
Python try except 示例
说了那么多,小伙伴们现在感到一头雾水是很正常的,我们多结合下面介绍的例子来理解,就很简单了。
示例 1:try except 处理单个异常
try:
print(a)
except NameError:
print('变量未定义!')运行结果如下。
变量未定义!分析:
如果你认为某一段代码有问题,你可以把这段代码放到 try 语句中,然后利用 except 语句进行处理。其中 except 语句后面要接一个异常类型。也就是说,你认为某一段代码有问题后,你要预估这段代码会出现什么异常,然后只有出现了这个异常后,except 后面接的处理代码才会执行。
像下面这段代码,你预估代码会出现 TypeError,但实际上代码出现的是 NameError,则 except 后面接的处理代码不会执行。
try:
print(a)
except TypeError:
print('变量未定义!')对于这个例子,我们还可以使用 as reason 捕获详细异常信息,实现代码如下:
try:
print(a)
except NameError as reason:
print(reason)运行结果如下。
(报错)name 'a' is not defined分析:
到这里就有小伙伴就会问了:“except 语句后面要接一个异常类型,并且还需要预估这段代码会出现什么异常。很奇怪为什么还需要用 try-except 用去捕获异常啊?不是事先都能猜到了吗?”
其实并不是这样的,我们都知道,一旦发生了异常,所有程序就会被中断。处理异常的目的并不是想要知道发生了什么异常,而是在于程序某段代码发生异常后,还能保证该异常代码后面的程序还能继续执行,而不是中断整个程序。请看下面的示例。
示例 2:没有加上异常处理
print(a)
print(1 + 1)运行结果如下。
(报错)NameError: name 'a' is not defined分析:
在上面例子中,由于变量 a 不存在,因此执行 print(a) 后会发生异常,接下来后面的 print(1+1) 也不会执行了。如果想要使得不管前面代码是否发生异常,后面的 print(1+1) 依旧会执行,该怎么办呢?此时异常处理就用得上了。
示例 3:加上异常处理
try:
print(a)
except NameError:
print('变量未定义!')
print(1 + 1)运行结果如下。
变量未定义!
2分析:
异常处理可以使得你编写的代码更加健壮,即使发生了异常,也不会影响后面代码的执行,这才是异常处理的目的所在,所以大家一定要把异常处理的目的搞清楚。
示例 4:try except 处理多个异常
try:
result = 1 + '2'
nums = [1, 2, 3, 4, 5]
print(result)
print(nums[8])
except (TypeError, IndexError) as reason:
print(reason)运行结果如下。
(报错)unsupported operand type(s) for +: 'int' and 'str'分析:
(TypeError, IndexError) 是一个元组,这个元组有两个元素:TypeError、IndexError。对于处理多个异常,都是使用元组的语法来实现的。
正常来说,上面这个示例的代码应该有两个异常,为什么这里只输出 TypeError 这一个异常的信息呢?原因是这样的:try 语句后面的代码块中,一旦有一句代码出现异常,则剩下的语句将不会被执行,也就是说我们只能使用 as reason 捕获到第一个异常。
即便如此,捕获多个异常的方式还是很有用的。为了简化,没有必要用多个 except 子句来输出同样的信息,而应改为用同一个 except 语句来处理。请看下面例子:
示例 5:同一个 except 语句处理多个异常
try:
result = 1 + '2'
nums = [1, 2, 3, 4, 5]
print(result)
print(nums[8])
except IndexError:
print('可能是IndexError、TypeError或SyntaxError')
except TypeError:
print('可能是IndexError、TypeError或SyntaxError')
except SyntaxError:
print('可能是IndexError、TypeError或SyntaxError')运行结果如下。
可能是IndexError、TypeError或SyntaxError分析:
像上面这种情况,最好的办法就是使用捕获多个异常的语法来处理,实现代码如下。
try:
result = 1 + '2'
numbers = [1, 2, 3, 4, 5]
print(result)
print(numbers[8])
except (IndexError, TypeError, SyntaxError):
print('可能是IndexError、TypeError或SyntaxError')示例 6:try except 处理所有异常
try:
result = 1 + '2'
except:
print('出错啦!')运行结果如下。
出错啦!分析:
即使程序处理了好几种异常,还是可能有一些漏网之鱼。如果你无法确定要对哪一类异常进行处理,只是希望在 try 语句块中一旦出现任何异常,可以给出一个 “看得懂” 的提醒,就可以像上面那样简单处理。不过在实际开发中,并不特别建议这样做,因为它会隐藏所有未想到并且未做好准备的错误。
