datawhale组队学习task3—异常处理

1.什么是异常?

  • 异常就是运行期检测到的错误。
  • 计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。

2.Python 标准异常总结

异常名称描述
BaseException所有异常的基类
Exception常规异常的基类
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算异常的基类
FloatingPointError浮点计算异常
OverflowError数值运算超出最大限制
ZeroDivisionError除数为零
AssertionError断言语句(assert)失败
AttributeError尝试访问未知的对象属性
EOFError没有内建输入,到达EOF标记
EnvironmentError操作系统异常的基类
IOError输入/输出操作失败
OSError操作系统产生的异常(例如打开一个不存在的文件)
WindowsError系统调用失败
ImportError导入模块失败的时候
KeyboardInterrupt用户中断执行
LookupError无效数据查询的基类
IndexError索引超出序列的范围
KeyError字典中查找一个不存在的关键字
MemoryError内存溢出(可通过删除对象释放内存)
NameError尝试访问一个不存在的变量
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用试图访问已经垃圾回收了的对象
RuntimeError一般的运行时异常
NotImplementedError尚未实现的方法
SyntaxError语法错误导致的异常
IndentationError缩进错误导致的异常
TabErrorTab和空格混用
SystemError一般的解释器系统异常
TypeError不同类型间的无效操作
ValueError传入无效的参数
UnicodeErrorUnicode相关的异常
UnicodeDecodeErrorUnicode解码时的异常
UnicodeEncodeErrorUnicode编码错误导致的异常
UnicodeTranslateErrorUnicode转换错误导致的异常
异常体系内部的层次关系

在这里插入图片描述

3. Python标准警告总结

警告名称描述
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
UserWarning用户代码生成的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑语法的警告
ImportWarning用于在导入模块过程中触发的警告
UnicodeWarning与Unicode相关的警告
BytesWarning与字节或字节码相关的警告
ResourceWarning与资源使用相关的警告

4. 异常处理

(1)try - except 语句
  • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
  • 如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码

try 语句按照如下方式工作:

  • 首先,执行try子句(在关键字try和关键字except之间的语句)
  • 如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码。
  • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
try:
    f = open('test.txt')
    print(f.read())
    f.close()
except OSError as error:
    print('打开文件出错\n原因是:' + str(error))
# 打开文件出错
# 原因是:[Errno 2] No such file or directory: 'test.txt'
  • 一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
try:
    int("abc")
    s = 1 + '1'
    f = open('test.txt')
    print(f.read())
    f.close()
except OSError as error:
    print('打开文件出错\n原因是:' + str(error))
except TypeError as error:
    print('类型出错\n原因是:' + str(error))
except ValueError as error:
    print('数值出错\n原因是:' + str(error))
# 数值出错
# 原因是:invalid literal for int() with base 10: 'abc'
  • try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except LookupError:
    print('查询错误')
except KeyError:
    print('键错误')
else:
    print(x)
# 查询错误

#规范排序
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
    x = dict1['y']
except KeyError:
    print('键错误')
except LookupError:
    print('查询错误')
else:
    print(x)
# 键错误
  • 一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
try:
    s = 1 + '1'
    int("abc")
    f = open('test.txt')
    print(f.read())
    f.close()
except (OSError, TypeError, ValueError) as error:
    print('出错了!\n原因是:' + str(error))
# 出错了!
# 原因是:unsupported operand type(s) for +: 'int' and 'str'
(2)try - except - finally 语句
  • 不管try子句里面有没有发生异常,finally子句都会执行。
try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码
finally:
    无论如何都会被执行的代码
  • 如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出。
def divide(x, y):
    try:
        result = x / y
        print("result is", result)
    except ZeroDivisionError:
        print("division by zero!")
    finally:
        print("executing finally clause")

divide(2, 1)
# result is 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'
(3) try - except - else 语句
  • 如果在try子句执行时没有发生异常,Python将执行else语句后的语句。
try:
    检测范围
except:
    出现异常后的处理代码
else:
    如果没有异常执行这块代码

#使用except而不带任何异常类型,这不是一个很好的方式,
#我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
try:
    检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
else:
    如果没有异常执行这块代码
#例
try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print("Error: 没有找到文件或读取文件失败")
else:
    print("内容写入文件成功")
    fh.close()
# 内容写入文件成功

注意:else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误。

(4)raise语句
  • Python 使用raise语句抛出一个指定的异常。
try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!') 
# An exception flew by!
参考文献

https://github.com/datawhalechina/team-learning-program/tree/master/Python-Language

练习题:

1、猜数字游戏
题目描述:
电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,“恭喜你猜到了这个数是…”。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。
(尝试使用try catch异常处理结构对输入情况进行处理)
获取随机数采用random模块。

import random
secret=random.randint(1,100)

i=1
while True:
    print('这是第%d次猜测'%i)
    try:
       num=input('请输入数字:')
       guess=int(num)
    except ValueError:
       print('输入无效')
    else:
       if guess>secret:
           print('太大了')
       elif guess=secret:
           print("恭喜你猜到了这个数是:%d"%secret)
           break 
       else:
           print('太小了')
       i+=1
print("游戏结束")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值