欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【python学习笔记】task03 异常处理

程序员文章站 2023-08-24 17:32:56
【python学习笔记】task03 异常处理异常处理1.python标准异常处理异常处理1.python标准异常处理异常名称描述BaseException所有异常的基类Exception常规异常的基类StandardError所有的内建标准异常的基类ArithmeticError所有数值计算异常的基类FloatingPointError浮点计算异常OverflowError数值运算超出最大限制ZeroDivisionError除数...

异常处理

在Python中,各种异常错误都是类,所有的错误类型都继承于BaseException。

1.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 缩进错误导致的异常
TabError Tab和空格混用
SystemError 一般的解释器系统异常
TypeError 不同类型间的无效操作
ValueError 传入无效的参数
UnicodeError Unicode相关的异常
UnicodeDecodeError Unicode解码时的异常
UnicodeEncodeError Unicode编码错误导致的异常
UnicodeTranslateError Unicode转换错误导致的异常

异常体系内部有层次关系,部分关系如下
【python学习笔记】task03 异常处理

2.python标准警告总结

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

3.try-except语句

基本格式

try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码

捕捉异常可以使用try-except语句。try-except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
(1)工作过程
try语句的工作过程如下:

  • 执行try子句(在关键字try和关键字except之间的语句)
  • 如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码。
  • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。

【例1】打开文件test.txt,如果不存在抛出异常,并输出“打开文件出错”

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'

【python文件读写】
python文件读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
open()读文件, close()关闭文件,write()写入文件
参考 www.py.cn/jishu/jichu/13328.html

(2)一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
【例2】本例中含有多个except字句,但是int(‘abc’),造成数值出错类错误,所以最终执行的只有ValueError

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))

(3)一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
【例3】try里面有多个错误,但是第一句就出错了,所以下面的也不会执行,except里包含多个异常,但是针对这个例子只用到了TypeError

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))

(4)在用try…except…机制处理异常的时候,一定要注意异常的继承关系。
【例4】本例子中具体而言应该为‘键错误’,但是由于
KeyError是LookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该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)

4.try-except-finally语句

基本格式

try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码
finally:
    无论如何都会被执行的代码

(1)不管try子句里面有没有发生异常,finally子句都会执行。
(2)如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出
【例子】在本例子有三种情况,一是正确的,而是被except拦截住了的异常,一种是没有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)
print('==================================')
divide(2,0)
print('==================================')
divide('2','1')

结果为
result is 2.0
executing finally clause
==================================
division by zero
executing finally clause
==================================
executing finally clause

5.try-except-else语句

如果在try子句执行时没有发生异常,Python将执行else语句后的语句。
基本格式为

try:
    检测范围
except:
    出现异常后的处理代码
else:
    如果没有异常执行这块代码

注意:else语句的存在必须以except语句的存在为前提,在没有except语句的try语句中使用else语句,会引发语法错误
【例子】写入一个文件,如果该文件原来不存在的话将被自动创建,所以try语句块无错误,执行完后执行else

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print("Error: 没有找到文件或读取文件失败")
else:
    print("内容写入文件成功")
    fh.close()

# 内容写入文件成功

结果为

# 内容写入文件成功

6.raise语句
raise语句用于抛出一个执行的异常
基本格式为

raise [Exception [, args [, traceback]]]

【python学习笔记】task03 异常处理
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
【例子】

try:
    raise NameError('HiHhere')
except NameError:
    print('An exception flew by!')

结果为

 print('An exception flew by!')

练习题

猜数字游戏

题目描述:

电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,“恭喜你猜到了这个数是…”。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。

(尝试使用try catch异常处理结构对输入情况进行处理)获取随机数采用random模块。

思路 参考了上节课中猜数字的代码,在输入数字部分加入try-except语句

import random
secret=random.randint(0,100)
print('密码是:',secret)
num=1
while(True):
    print('第%d次猜,请输入一个整型数字'%(num),end='')
    temp=input()
    num=num+1
    try:
        guess=int(temp)
    except ValueError:
        print('输入无效')
        continue
    if secret>guess:
        print('太小')
    elif secret<guess:
        print('太大')
    else:
        print('恭喜你猜到了这个数是%d'%(guess))
        break

参考文章

Python 异常处理https://www.runoob.com/python/python-exceptions.html
Python3 错误和异常 https://www.runoob.com/python3/python3-errors-execptions.html

本文地址:https://blog.csdn.net/a8689756/article/details/107557473

相关标签: python学习笔记