Task 3: 异常处理(2天)

异常处理

目录

1.python 标准异常总结

2.python 标准警告总结

3.try_excpt 语句

4.try_except_finally 语句

5.try_except_else 语句

6.raise 语句

正文

本次学习任务真的太好了,很久之前就想整理一下各种报错到底是什么东西引起的

以后可以直接查看字典了


1.python 标准异常总结

 1 BaseException:所有异常的 基类
 2 Exception:常规异常的 基类
 3 StandardError:所有的内建标准异常的基类
 4 ArithmeticError:所有数值计算异常的基类
 5 FloatingPointError:浮点计算异常
 6 OverflowError:数值运算超出最大限制
 7 ZeroDivisionError:除数为零
 8 AssertionError:断言语句(assert)失败
 9 AttributeError:尝试访问未知的对象属性
10 EOFError:没有内建输入,到达EOF标记
11 EnvironmentError:操作系统异常的基类
12 IOError:输入/输出操作失败
13 OSError:操作系统产生的异常(例如打开一个不存在的文件14 WindowsError:系统调用失败
15 ImportError:导入模块失败的时候
16 KeyboardInterrupt:用户中断执行
17 LookupError:无效数据查询的基类
18 IndexError:索引超出序列的范围
19 KeyError:字典中查找一个不存在的关键字
20 MemoryError:内存溢出(可通过删除对象释放内存)
21 NameError:尝试访问一个不存在的变量
22 UnboundLocalError:访问未初始化的本地变量
23 ReferenceError:弱引用试图访问已经垃圾回收了的对象
24 RuntimeError:一般的运行时异常
25 NotImplementedError:尚未实现的方法
26 SyntaxError:语法错误导致的异常
27 IndentationError:缩进错误导致的异常
28 TabError:Tab和空格混用
29 SystemError:一般的解释器系统异常
30 TypeError:不同类型间的无效操作
31 ValueError:传入无效的参数
32 UnicodeError:Unicode相关的异常
33 UnicodeDecodeError:Unicode解码时的异常
34 UnicodeEncodeError:Unicode编码错误导致的异常
35 UnicodeTranslateError:Unicode转换错误导致的异常

标黄色的是经常会遇到的报错类型

#这个是由于函数名或者方法或或者属性重名了
list=['a','b']
list('abcd')

#TypeError: 'list' object is not callable

2.python 标准警告总结

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

3.try-except 语句

#格式如下,[]表示该参数可以输入,或者不输入
try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码

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

1 首先,执行try子句(在关键字try和关键字except之间的语句)
2 如果没有异常发生,忽略except子句,try子句执行后结束。
3 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的报错类型的名称(Exception)相符,那么对应的except子句将被执行。最后执行try语句之后的代码。
4 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
#FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'
f = open('test1.txt') 


#可以起as 别名,也可以不起
try:
    f = open('test1.txt')
    print(f.read())
    f.close()
except OSError as error:
    print('打开文件出错
原因是:' + str(error))
#输出:
打开文件出错
原因是:[Errno 2] No such file or directory: 'test1.txt'


#FileNotFoundError 替换 OSError
try:
    f = open('test1.txt')
    print(f.read())
    f.close()
except FileNotFoundError as error:
    print('打开文件出错
原因是:' + str(error))
#输出:
打开文件出错
原因是:[Errno 2] No such file or directory: 'test1.txt'



#TypeError 替换OSError,如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
try:
    f = open('test1.txt')
    print(f.read())
    f.close()
except TypeError as error:
    print('打开文件出错
原因是:' + str(error))
#输出:FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'

一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行

#直接执行try里面的代码
int("abc")  #ValueError: invalid literal for int() with base 10: 'abc'
s = 1 + '1'  #TypeError: unsupported operand type(s) for +: 'int' and 'str'
f = open('test1.txt')  #FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'

    
#一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行      
try:
    int("abc")   
    s = 1 + '1'
    f = open('test1.txt')
    print(f.read())
    f.close()
except OSError as error:
    print('打开文件出错
原因是:' + str(error))
except TypeError as error:
    print('类型出错
原因是:' + str(error))
except ValueError as error:
    print('数值出错
原因是:' + str(error))    
    
#输出:
#数值出错
#原因是:invalid literal for int() with base 10: 'abc'

同一语句可以犯了了好几种异常,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常

#try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,
且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常
#单独执行 dict1 = {'a': 1, 'b': 2, 'v': 22} x = dict1['y'] #KeyError: 'y' dict1 = {'a': 1, 'b': 2, 'v': 22} try: x = dict1['y'] except LookupError: print('查询错误') except KeyError: print('键错误') else: print(x) # 查询错误

一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

 1 s = 1 + '1'  #TypeError: unsupported operand type(s) for +: 'int' and 'str' 
 2 
 3 # 一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组  
 4 #也是只输出第一个报错原因    
 5 try:
 6     s = 1 + '1'
 7     int("abc")
 8     f = open('test.txt')
 9     print(f.read())
10     f.close()
11 except (OSError, TypeError, ValueError) as error:
12     print('出错了!
原因是:' + str(error))
13 
14 #输出
15 '''
16 出错了!
17 原因是:unsupported operand type(s) for +: 'int' and 'str'    
18 '''   

4.try-except-finally 语句

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

不管try子句里面有没有发生异常,finally子句都会执行

如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在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'

5.try_except_else 语句

如果在try子句执行时没有发生异常,Python将执行else语句后的语句

#使用except而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常
try:
    检测范围
except:
    出现异常后的处理代码
else:
    如果没有异常执行这块代码

因此我们使用下面这种方式

try:
    检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
else:
    如果没有异常执行这块代码
#如果try子句执行没有发生异常,则将执行else内的语句,否则不执行    
def divide(x, y):
    try:
        result = x / y
        print("result is", result)
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("计算成功")    
        
divide(2, 1)
divide(2, 0)

6.raise 语句

学习任务给出的例子看的不是很明白,我就找了其他的例子

当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行

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

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象

#抛出一个指定的异常    
def division():
    num1=int(input('请输入被除数:'))
    num2=int(input('请输入除数:'))
    if num2==0:
        raise ValueError('除数不能为0')
    result=num1//num2
    print(result)
if __name__=='__main__':
    try:
        division()
    except ZeroDivisionError:
        print('输入错误,除数不能为0')
    except ValueError as e:   # 处理ValueError异常
        print('输入错误',e)    #输出错误原因
    finally:
        print('释放资源并关闭')   

练习题

1、猜数字游戏

题目描述:

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

 如果输入了非数字,就终止程序

import numpy as np 
import pandas as pd 
a=np.random.randint(0,100) 
n=0
try:
    while 1:
        b=int(input('第{}次输入:'.format(n+1)))
        n=n+1 
        
        if a==b:
            print('恭喜你猜到了,这个数是:',b)
            break
        elif b>a:
            print('数字猜大了')
        else:
             print('数字猜小了')
        

except ValueError as error:
    print('输入无效')
    n=n+1    

finally:
    print(n)

 如果输入了非数字,还是继续输入

import random
secert = random.randint(1, 100) # 计算机生成一个随机数  
n=1        
while 1:
    num = input("第{}次输入: ".format(n))
    n=n+1
    if num.isdigit():
        tmp = int(num)
        if tmp == secert:
            print('恭喜你猜到了,这个数是:',num)
            break
        elif tmp < secert:
            print("数字猜小了")
            
        else:
            print("数字猜大了")
            
    else:
        print("输入无效")

官方答案是下面的:

import random
guess=random.randint(1,101)
i=1
while True:
    print ("第%d次猜,请输入一个整数数字:"%(i))
    try:
        temp=int(input())
        i+=1
    except ValueError :
        print ("输入无效")
        continue
    if temp==guess:
        print ("恭喜你猜对了,就是这个数",guess)
        break;
    elif (temp>guess):
        print ("大了")
    elif (temp<guess):
        print ("小了")
原文地址:https://www.cnblogs.com/cgmcoding/p/13372268.html