前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 异常处理

python 异常处理

原创
作者头像
ruochen
修改2021-02-22 10:16:07
2.3K0
修改2021-02-22 10:16:07
举报

异常

  • 广义上的错误分为错误和异常
  • 错误指的是可以人为避免
  • 异常是指在语法逻辑正确的而前提下,出现的问题
  • 在python中,异常是一个类,可以处理和使用

异常的分类

代码语言:txt
复制
BaseException 所有异常的基类
代码语言:txt
复制
Exception 常见错误的基类
代码语言:txt
复制
ArithmeticError 所有数值计算错误的基类
代码语言:txt
复制
Warning 警告的基类
代码语言:txt
复制
AssertError 断言语句(assert)失败
代码语言:txt
复制
AttributeError 尝试访问未知的对象属性
代码语言:txt
复制
DeprecattionWarning 关于被弃用的特征的警告
代码语言:txt
复制
EOFError 用户输入文件末尾标志EOF(Ctrl+d)
代码语言:txt
复制
FloattingPointError 浮点计算错误
代码语言:txt
复制
FutureWarning 关于构造将来语义会有改变的警告
代码语言:txt
复制
GeneratorExit generator.close()方法被调用的时候
代码语言:txt
复制
ImportError 导入模块失败的时候
代码语言:txt
复制
IndexError 索引超出序列的范围
代码语言:txt
复制
KeyError 字典中查找一个不存在的关键字
代码语言:txt
复制
KeyboardInterrupt 用户输入中断键(Ctrl+c)
代码语言:txt
复制
MemoryError 内存溢出(可通过删除对象释放内存)
代码语言:txt
复制
NamerError 尝试访问一个不存在的变量
代码语言:txt
复制
NotImplementedError 尚未实现的方法
代码语言:txt
复制
OSError 操作系统产生的异常(例如打开一个不存在的文件)
代码语言:txt
复制
OverflowError 数值运算超出最大限制
代码语言:txt
复制
OverflowWarning 旧的关于自动提升为长整型(long)的警告
代码语言:txt
复制
PendingDeprecationWarning 关于特征会被遗弃的警告
代码语言:txt
复制
ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
代码语言:txt
复制
RuntimeError 一般的运行时错误
代码语言:txt
复制
RuntimeWarning 可疑的运行行为(runtime behavior)的警告
代码语言:txt
复制
StopIteration 迭代器没有更多的值
代码语言:txt
复制
SyntaxError Python的语法错误
代码语言:txt
复制
SyntaxWarning 可疑的语法的警告
代码语言:txt
复制
IndentationError 缩进错误
代码语言:txt
复制
TabError Tab和空格混合使用
代码语言:txt
复制
SystemError Python编译器系统错误
代码语言:txt
复制
SystemExit Python编译器进程被关闭
代码语言:txt
复制
TypeError 不同类型间的无效操作
代码语言:txt
复制
UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
代码语言:txt
复制
UnicodeError Unicode相关的错误(ValueError的子类)
代码语言:txt
复制
UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
代码语言:txt
复制
UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
代码语言:txt
复制
UserWarning 用户代码生成的警告
代码语言:txt
复制
ValueError 传入无效的参数
代码语言:txt
复制
ZeroDivisionError 除数为零
代码语言:txt
复制
l = [1,2,3,4,5]
# 除零错误
num = int(input("Please input your num: "))
print(100/num)
代码语言:txt
复制
Please input your num: 0
代码语言:txt
复制
---------------------------------------------------------------------------
代码语言:txt
复制
ZeroDivisionError                         Traceback (most recent call last)
代码语言:txt
复制
<ipython-input-1-8abb196ce2aa> in <module>
代码语言:txt
复制
      2 # 除零错误
代码语言:txt
复制
      3 num = int(input("Please input your num: "))
代码语言:txt
复制
----> 4 print(100/num)
代码语言:txt
复制
ZeroDivisionError: division by zero

异常处理

  • 不能保证程序永远正确运行
  • 但是,必须保证程序在最坏的情况下得到的问题被妥善管理
  • python的异常处理模块全部语法为:
代码语言:txt
复制
    try:
代码语言:txt
复制
        尝试实现某个操作,
代码语言:txt
复制
        如果没有出现异常,任务就可以完成
代码语言:txt
复制
        如果出现异常,将异常从当前代码块扔出去尝试解决异常
代码语言:txt
复制
    except 异常类型1:
代码语言:txt
复制
        解决方案1:用于尝试在此处处理异常解决问题
代码语言:txt
复制
    except 异常类型2:
代码语言:txt
复制
        解决方案2:用于尝试在此处处理异常解决问题
代码语言:txt
复制
    except (异常类型1,异常类型2...):
代码语言:txt
复制
        解决方案:针对多个异常使用相同的处理方式
代码语言:txt
复制
    except:
代码语言:txt
复制
        如果没有出现任何异常,将会执行此处代码
代码语言:txt
复制
    finally:
代码语言:txt
复制
        有没有异常都要执行的代码
  • 流程
    1. 执行try下面的语句
    2. 如果出现异常,则在except语句里查找对应异常病进行处理
    3. 如果没有出现异常,则执行else语句内容
    4. 最后,不管是否出现异常,都要执行finally语句
  • 除except(最少一个)以外,else和finally可选
代码语言:txt
复制
# 简单异常案例
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("计算结果是:{}".format(rst))
except:
    print("输入错误")
    # exit是退出程序的意思
    exit()
代码语言:txt
复制
Please input your number:0
代码语言:txt
复制
输入错误
代码语言:txt
复制
# 简单异常案例
# 给出提示信息
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("计算结果是:{}".format(rst))
# 捕获异常后,把异常实例化,出错信息会在实例里
# 注意以下写法
# 以下语句是捕获ZeroDivisionError异常并实例化实例e
except ZeroDivisionError as e:
    print("输入错误")
    print(e)
    # exit是退出程序的意思
    exit()
代码语言:txt
复制
# 简单异常案例
# 给出提示信息
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("计算结果是:{}".format(rst))
# 如果是多种error的情况
# 需要把越具体的错误,越往前放
# 在异常类继承关系中,越是子类的异常,越要往前放,
# 越是父类的异常,越要往后放 、

# 在处理异常的时候,一旦拦截到某一个异常,则不再继续往下查看,直接进行下一个
# 代码,即有finally则执行finally语句,否贼就执行下一个大的语句
except ZeroDivisionError as e:
    print("输入错误")
    print(e)
    # exit是退出程序的意思
    exit()
except NameError as e:
    print("名字起错了")
    print(e)

except AttributeError as e:
    print("属性错误")
    print(e)
    exit()
# 常见错误的基类
# 如果写下面这句话,常见异常都会拦截住
# 而且下面这句话一定是最后一个excepttion
except Exception as e:
    print("我也不知道就出错了")
    print(e)

except ValueError as e:
    print("NO>>>>>>>>>>>")
print("hahaha")
代码语言:txt
复制
Please input your number:ffff
代码语言:txt
复制
我也不知道就出错了
代码语言:txt
复制
invalid literal for int() with base 10: 'ffff'
代码语言:txt
复制
hahaha

用户手动引发异常

  • 当某些情况,用户希望自己引发一个异常的时候,可以使用
  • raise 关键字来引发异常
代码语言:txt
复制
# raise 案例
try:
    print("I love you")
    print(3.1415926)
    # 手动引发一个异常
    # 注意语法:raise ErrorClassName
    raise ValueError
    print("还没完呀")
except NameError as e:
    print("NameError")
except ValueError as e:
    print("ValueError")
except Exception as e:
    print("有异常")
finally:
    print("我肯定会被执行的")
代码语言:txt
复制
I love you
代码语言:txt
复制
3.1415926
代码语言:txt
复制
ValueError
代码语言:txt
复制
我肯定会被执行的
代码语言:txt
复制
# raise 案例-2
# 自定义异常
# 需要注意:自定义异常必须是系统异常的子类
class DanaValueError(ValueError):
    pass

try:
    print("I love you")
    print(3.1415926)
    # 手动引发一个异常
    # 注意语法:raise ErrorClassName
    raise DanaValueError
    print("还没完呀")
except NameError as e:
    print("NameError")
# except DanaValueError as e:
#    print("DanaError")
except ValueError as e:
    print("ValueError")
except Exception as e:
    print("有异常")
finally:
    print("我肯定会被执行的")
代码语言:txt
复制
I love you
代码语言:txt
复制
3.1415926
代码语言:txt
复制
ValueError
代码语言:txt
复制
我肯定会被执行的
代码语言:txt
复制
# else语句案例

try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("计算结果是:{}".format(rst))
except Exception as e:
    print("Exceptiong")  
    
else:
    print("No Exception")
finally:
    print("反正我会被执行")
代码语言:txt
复制
Please input your number:0
代码语言:txt
复制
Exceptiong
代码语言:txt
复制
反正我会被执行

关于自定义异常

  • 只要是raise异常,则推荐自定义异常
  • 在自定义异常的时候,一般包含以下内容:
    • 自定义发生异常的异常代码
    • 自定义发生异常后的问题提示
    • 自定义发生异常的行数
  • 最终的目的是,一旦发生异常,方便程序员快速定位错误现场

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异常
  • 异常的分类
  • 异常处理
  • 用户手动引发异常
  • 关于自定义异常
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档