关于python:python-异常处理

1次阅读

共计 3954 个字符,预计需要花费 10 分钟才能阅读完成。

异样

  • 狭义上的谬误分为谬误和异样
  • 谬误指的是能够人为防止
  • 异样是指在语法逻辑正确的而前提下,呈现的问题
  • 在 python 中,异样是一个类,能够解决和应用

异样的分类


BaseException 所有异样的基类
Exception 常见谬误的基类
ArithmeticError 所有数值计算错误的基类
Warning 正告的基类

AssertError 断言语句(assert)失败
AttributeError 尝试拜访未知的对象属性
DeprecattionWarning 对于被弃用的特色的正告
EOFError 用户输出文件开端标记 EOF(Ctrl+d)FloattingPointError 浮点计算错误
FutureWarning 对于结构未来语义会有扭转的正告
GeneratorExit generator.close() 办法被调用的时候
ImportError 导入模块失败的时候
IndexError 索引超出序列的范畴
KeyError 字典中查找一个不存在的关键字
KeyboardInterrupt 用户输出中断键(Ctrl+c)MemoryError 内存溢出(可通过删除对象开释内存)NamerError 尝试拜访一个不存在的变量
NotImplementedError 尚未实现的办法
OSError 操作系统产生的异样(例如关上一个不存在的文件)OverflowError 数值运算超出最大限度
OverflowWarning 旧的对于主动晋升为长整型(long)的正告
PendingDeprecationWarning 对于特色会被遗弃的正告
ReferenceError 弱援用(weak reference)试图拜访一个曾经被垃圾回收机制回收了的对象
RuntimeError 个别的运行时谬误
RuntimeWarning 可疑的运行行为(runtime behavior)的正告
StopIteration 迭代器没有更多的值
SyntaxError Python 的语法错误
SyntaxWarning 可疑的语法的正告
IndentationError 缩进谬误
TabError Tab 和空格混合应用
SystemError Python 编译器零碎谬误
SystemExit Python 编译器过程被敞开
TypeError 不同类型间的有效操作
UnboundLocalError 拜访一个未初始化的本地变量(NameError 的子类)UnicodeError Unicode 相干的谬误(ValueError 的子类)UnicodeEncodeError Unicode 编码时的谬误(UnicodeError 的子类)UnicodeDecodeError Unicode 解码时的谬误(UnicodeError 的子类)UserWarning 用户代码生成的正告
ValueError 传入有效的参数
ZeroDivisionError 除数为零

l = [1,2,3,4,5]
# 除零谬误
num = int(input("Please input your num:"))
print(100/num)
Please input your num: 0



---------------------------------------------------------------------------

ZeroDivisionError                         Traceback (most recent call last)

<ipython-input-1-8abb196ce2aa> in <module>
      2 # 除零谬误
      3 num = int(input("Please input your num:"))
----> 4 print(100/num)


ZeroDivisionError: division by zero

异样解决

  • 不能保障程序永远正确运行
  • 然而,必须保障程序在最坏的状况下失去的问题被妥善治理
  • python 的异样解决模块全副语法为:

    try:
        尝试实现某个操作,如果没有出现异常,工作就能够实现
        如果出现异常,将异样从以后代码块扔出去尝试解决异样
    
    except 异样类型 1:解决方案 1:用于尝试在此处解决异样解决问题
        
    except 异样类型 2:解决方案 2:用于尝试在此处解决异样解决问题
    
    except(异样类型 1,异样类型 2...):解决方案:针对多个异样应用雷同的解决形式
        
    except:如果没有呈现任何异样,将会执行此处代码
    
    finally:有没有异样都要执行的代码
        
  • 流程

    1. 执行 try 上面的语句
    2. 如果出现异常,则在 except 语句里查找对应异样病进行解决
    3. 如果没有出现异常,则执行 else 语句内容
    4. 最初,不论是否出现异常,都要执行 finally 语句
  • 除 except(起码一个)以外,else 和 finally 可选
# 简略异样案例
try:
    num = int(input("Please input your number:"))
    rst = 100/num
    print("计算结果是:{}".format(rst))
except:
    print("输出谬误")
    # exit 是退出程序的意思
    exit()
Please input your number:0
输出谬误


# 简略异样案例
# 给出提示信息
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()
# 简略异样案例
# 给出提示信息
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")
Please input your number:ffff
我也不晓得就出错了
invalid literal for int() with base 10: 'ffff'
hahaha

用户手动引发异样

  • 当某些状况,用户心愿本人引发一个异样的时候,能够应用
  • raise 关键字来引发异样
# 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("我必定会被执行的")
I love you
3.1415926
ValueError
我必定会被执行的


# 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("我必定会被执行的")
I love you
3.1415926
ValueError
我必定会被执行的


# 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("反正我会被执行")
Please input your number:0
Exceptiong
反正我会被执行

对于自定义异样

  • 只有是 raise 异样,则举荐自定义异样
  • 在自定义异样的时候,个别蕴含以下内容:

    • 自定义产生异样的异样代码
    • 自定义产生异样后的问题提醒
    • 自定义产生异样的行数
  • 最终的目标是,一旦产生异样,不便程序员疾速定位谬误现场
正文完
 0