Python try except 语句

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 语句块中一旦出现任何异常,可以给出一个 “看得懂” 的提醒,就可以像上面那样简单处理。不过在实际开发中,并不特别建议这样做,因为它会隐藏所有未想到并且未做好准备的错误。

提示: Python try except 语句还可以结合 else 子句、finally 子句来一起使用。

上一篇: Python 异常处理

下一篇: Python else 子句

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号