目录

  • 工作原理
  • 如果一个程序有几个错误怎么办
  • 获取异常对象
  • 匹配所有异常
  • 获取详细的异常信息


工作原理

  • 在编写这段代码的时候, 我们就可以预料到,可能用户会输入非数字的字符,这样用int转化就会出错,导致整个程序就退出了。
    用 try 和 except 就可以 完善这个程序
while True:
    try:
        miles = input('请输入英里数:')
        km = int(miles) * 1.609344
        print(f'等于{km}公里')
    except ValueError:
        print('你输入了非数字字符')

try 下面缩进的3行代码可以看成是 保护区 中的代码。

如果执行保护区中代码时,出现异常,解释器会结束保护区中后续代码的执行,并检查这个异常的类型是否匹配后面的except 语句中声明的类型。

如果匹配上,解释器知道程序对此种异常是预料到的,并且有对应的处理方案,也就是匹配的except下面缩进的代码。解释器就执行匹配的except下面缩进的代码,不会因此中止程序。

上面的例子中,执行 try 下面缩进的代码时,如果用户输入了 hello 这样的非数字, 就会在这行语句处

km = int(miles) * 1.609344

产生 ValueError 类型的异常, 解释器就会去查看后面的 except 语句是否声明了对 ValueError 异常的处理。

发现有, 就会执行后面缩进的代码。也就是这句代码

print('你输入了非数字字符')

except 后面缩进的代码 就是对这种类型错误 的一种处理

既然程序已经知道如何处理这种问题, 就不需要结束执行,只需要执行完 处理代码后, 进行原来正常的执行流程。

在这里,就是继续 while True 循环。


如果一个程序有几个错误怎么办

  • 如果我们开发程序的时候,估计某个代码段中可能出现好几种类型的异常,可以使用多个except 代码段,分别捕获多种类型的异常
try:
    choice = input('输入你的选择:')
    if choice == '1':
        100/0
    elif choice == '2':
        [][2]
except ZeroDivisionError:
    print ('出现 ZeroDivisionError')
except IndexError  :
    print ('出现 IndexError')

获取异常对象

  • 我们使用except 语句匹配异常类型的时候, 可以使用as关键字,后面加一个变量名,这样,运行代码的时候,当try中的语句产生异常对象时,就会 把产生的异常对象赋值给as后的变量
try:
    100/0
except ZeroDivisionError as e:
    print (f'异常对象信息:{e}')

python try except如何设置超时时间 python try except函数_编程语言

产生的异常对象赋值给了变量 e。

这样我们就可以在后续的代码中得到产生的异常对象的信息。


匹配所有异常

  • 因为所有的异常都是 Exception 的子类。 所以 Exception能匹配所有类型的异常。
try:
    100/0
except Exception as e:
    print('未知异常:', e)
  • except 后面 没有写异常的类型,也表示匹配所有的异常。
try:
    100/0
except:
    print('未知异常:')

获取详细的异常信息

  • 在except下面缩进代码中,使用traceback模块里面的format_exc函数,可以显示异常的信息 和 异常产生处的函数调用栈的信息。
import traceback

try:
    100/0
except :
    print(traceback.format_exc())

python try except如何设置超时时间 python try except函数_经验分享_02


会打印出导致异常的详细的函数调用栈的信息。