python基础学习-异常捕获

简单记录一下异常捕获的两种方法,大佬绕路

1、try-except

http://www.cdgdc.edu.cn/cn/
如果不用异常捕获的话

# try_except捕获异常

file = open('不存在的文件.txt')
print(file.read())
file.close()

会出现报错
在这里插入图片描述

添加异常捕获

# try_except捕获异常

try:
  file = open('不存在的文件.txt')
  print(file.read())
  file.close()
# 操作系统方面的异常
except OSError:
  print('文件出错!')

成功捕获并打印
在这里插入图片描述
这种情况我们只能捕获到出错,下面的代码可以把错误原因一并提示用户

# try_except捕获异常

try:
  file = open('不存在的文件.txt')
  print(file.read())
  file.close()
# 输出原因
except OSError as reason:
  print('文件出错!\n错误的原因是' + str(reason))

运行结果
在这里插入图片描述
多个except

# try_except捕获异常

try:
  # 加法会报错
  sum = 1 + '1'
  file = open('不存在的文件.txt')
  print(file.read())
  file.close()
# 操作系统方面的异常
# except OSError:
#   print('文件出错!')
# 输出原因
except OSError as reason:
  print('文件出错!\n错误的原因是' + str(reason))
# 多个except
except TypeError as reason:
  print('类型出错!\n错误的原因是' + str(reason))

这里添加了多个except,在try的第一行,运行加法的类型先出错了(int和str不能相加)。这里就会先捕捉到错误,然后提示用户。
ps:try语句检测范围一旦出现异常,剩下的语句就不会被执行了,所以这里在进行加法的时候捕获了异常,后面的语句都不再执行了。
在这里插入图片描述

上述代码,针对特定的一类错误进行了捕获后提示用户,但实际上可能往往我们不可能涵盖报错的内容,所以其实这里可以直接用except对用户进行提示

# try_except捕获异常

try:
  # 转换出错
  int('abc')
  # 加法会报错
  sum = 1 + '1'
  file = open('不存在的文件.txt')
  print(file.read())
  file.close()
# 包含所有报错,不指定特定报错
except:
  print('出错!')

在这里插入图片描述
这种情况下,只要出现错误,系统就直接笼统提示出错,但这样并不能精准定位,也会隐藏一些未知的错误,所以其实这种做法其实并不推荐。

同时对多个except进行捕获
即可以将上面的OSError,TypeError放在一起进行捕获,然后进行相关的提示

# try_except捕获异常

try:
  # 加法会报错
  sum = 1 + '1'
  file = open('不存在的文件.txt')
  print(file.read())
  file.close()
# 操作系统方面的异常
# except OSError:
#   print('文件出错!')
# 输出原因
# except OSError as reason:
#   print('文件出错!\n错误的原因是' + str(reason))
# # 多个except
# except TypeError as reason:
#   print('类型出错!\n错误的原因是' + str(reason))
# 包含所有报错,不指定特定报错
# 上面两个异常捕获也可以写成下面的样子
except (OSError, TypeError) as reason:
  print('出错!错误的原因是' + str(reason))

这样一来可以减少代码冗余
在这里插入图片描述
注意这里也是捕获到第一个异常后就不会运行后面的代码了。

2、try-finally

在这里插入图片描述
对于上述第一种try-except方法其实会存在一种问题:针对之前打开文件这一块的异常,如果异常是在文件打开之后抛出的,那么文件打开后,后面的语句将不再执行,也就是说文件打开后将不能执行关闭操作。如果出现类似的情况,程序抛出异常后崩溃了,那么所有数据都会在缓存区内,不会被写入文件。

如同下面的例子

# try_finally捕获异常

try:
  # 以写入的方式创建文件
  file = open('不存在的文件.txt', 'w')
  # 文件写入内容
  print(file.write('写入内容'))
  # 加法会报错,异常出现在打开文件之后
  sum = 1 + '1'
  file.close()
# 提示出错
except (OSError, TypeError) as reason:
  print('出错!错误的原因是' + str(reason))

运行结果
在这里插入图片描述
在这里插入图片描述
虽然成功写入内容,但后面的加法报错,会抛出异常,在异常出现后的语句将不会执行。

这种情况下,就可以加入finally,将必须执行的语句放在finally当中,这里的关闭文件的语句就可以放在finally当中

# try_finally捕获异常

try:
  # 以写入的方式创建文件
  file = open('不存在的文件.txt', 'w')
  # 文件写入内容
  print(file.write('写入内容'))
  # 加法会报错,异常出现在打开文件之后
  sum = 1 + '1'
# 提示出错
except (OSError, TypeError) as reason:
  print('出错!错误的原因是' + str(reason))
# 通过finally运行必须要做的语句
finally:
  file.close()

总结

在执行try语句时,如果try语句当中没有任何出错的语句,就会跳过except中的内容,执行finally当中的内容。
如果try语句当中出现报错,则会根据异常类型,在except当中找到对应的类型,执行后面对应的处理代码。最后执行finally当中的语句(无论是否产生异常,finally当中的语句都将被执行)

3、raise

我们还可以在程序的指定位置手动抛出一个异常。
在这里插入图片描述
这里手动设置了一个除数为0的异常

另外借用一篇文章进行详细说明raise使用
raise 语句有如下三种常用的用法:
1.raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
2.raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
3.raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

Guess you like

Origin blog.csdn.net/m0_47146037/article/details/120657162