python基础-第九天-异常处理

目录

异常的种类

异常的定位

try...一个except结构

小练习

try...多个except结构

try...except...else 结构

try...except...finally 结构

return和异常的用法

常见异常

常见异常汇总

with上下文管理

自定义异常类


异常的种类

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。
所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。

异常的定位

当发生异常时,解释器会报相关的错误信息,并会在控制台打印出相关错误信息。我们 只需按照从上到下的顺序即可追溯(Trackback)错误发生的过程,最终定位引起错误的那一 行代码。
 

try...一个except结构

try..except是最常见的异常处理结构,结果如下:

try:
    被监控的可能引发异常的语句块
except BaseException [as e]:
    异常处理语句块

示例:

print('step 01')
try:
    print('step 02')
    a=1/0 #这里出现异常
    print('step 03')  #这里就被跳过,进入except部分
except:
    print('step 04')
print('step 05')
****结果如下***
step 01
step 02
step 04
step 05

小练习

循环输入数字,如果不是数字则处理异常,直到输入88,结束循环

while True:
    try:
        x=int(input('输入数字:'))
        if x==88:
            break
    except:
        print('请输入数字!!!')
print('程序结束。')

try...多个except结构

一般建议 尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代 码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException。

try:
    被监控的可能引起异常的语句块
except:
    处理except1的语句块
except:
    处理except2的语句块
....

try...except...else 结构

try: 
    a = input("请输入被除数:") 
    b = input("请输入除数:") 
    c = float(a)/float(b) 
except BaseException as e: 
    print(e) 
else: 
    print("除的结果是:",c)
****结果如下****
请输入被除数:100 
请输入除数:0 
floatdivisionbyzero

如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。
 

try...except...finally 结构
 

try: 
    a = input("请输入一个被除数:") 
    b = input("请输入一个除数:") 
    c = float(a)/float(b) 
except BaseException as e: 
    print(e) 
else: 
    print(c) 
finally: 
    print("我是 finally 中的语句,无论发生异常与否,都执行!")
print("程序结束!")
****结果如下****
请输入被除数:99
请输入除数:0 
floatdivisionbyzero 
我是 finally 中的语句,无论是否发生异常都执行

finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。
 

return和异常的用法

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构 中,而是放到方法最后。

常见异常

1.SyntaxError                语法错误

2.NameError                 尝试访问一个未定义的对象

3.ZeroDivisionError       零除错误

4.ValueError                  数值错误

5.TypeError                   类型错误

6.AttributeError             属性错误

7.IndexError                  索引越界异常

8.KeyError                    字典的关键字不存在

常见异常汇总

异常名称说明异常名称说明
ArithmeticError所有数值计算错误的基类OverflowWarning旧的关于自动提升为长整型(long)的警告
AssertionError断言语句失败PendingDeprecationWarning关于特性将会被废弃的警告
AttributeError对象没有这个属性ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
BaseException所有异常的基类RuntimeError一般的运行时错误
DeprecationWarning关于被弃用的特征的警告RuntimeWarning可疑的运行时行为(runtime behavior)的警告
EnvironmentError操作系统错误的基类StandardError所有的内建标准异常的基类
EOFError没有内建输入,到达EOF标记StopIteration迭代器没有更多的值
Exception常规错误的基类SyntaxErrorPython语法错误
FloatingPointError浮点计算错误SyntaxWarning可疑的语法的警告
FutureWarning关于构造将来语义会有改变的警告SystemError一般的解释器系统错误
GeneratorExit生成器(generator)发生异常来通知退出SystemExit解释器请求退出
ImportError导入模块/对象失败TabErrorTab和空格混用
IndentationError缩进错误TypeError对类型无效的操作
IndexError序列中没有此索引(index)UnboundLocalError访问未初始化的本地变量
IOError输入/输出操作失败UnicodeDecodeErrorUnicode 解码时的错误
KeyboardInterrupt用户中断执行(通常是输入^C)UnicodeEncodeErrorUnicode编码时错误
KeyError映射中没有这个键UnicodeErrorUnicode相关的错误
LookupError无效数据查询的基类UnicodeTranslateErrorUnicode转换时错误
MemoryError内存溢出错误(对于Python解释器不是致命的)UserWarning用户代码生成的警告
NameError未声明/初始化对象(没有属性)ValueError传入无效的参数
NotImplementedError尚未实现的方法Warning警告的基类
OSError操作系统错误WindowsError系统调用失败
OverflowError数值运算超出最大限制ZeroDivisionError除(或取模)零(所有数据类型

with上下文管理

with context_expr[as var]: 
    语句块

with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自动还原进入该代码之前的 现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极 大的简化了工作,在文件操作、网络通信相关的场合非常常用。

自定义异常类

class AgeError (Exception):
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo=errorInfo
    def __str__(self):
        return '年龄错误'
if __name__=="__main__":
    age=int(input('输入年龄:'))
    if age<1 or age>150:
        raise AgeError(age)
    else:
        print('正常的年龄:',age)
****结果如下****
输入年龄:151
Traceback (most recent call last):
  File "D:/学习/课程/基础知识/venv/yc02.py", line 10, in <module>
    raise AgeError(age)
__main__.AgeError: 年龄错误

 

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页