Advertisement

Python中的异常处理try、exception、raise

阅读量:

一、try...except

偶尔编写程序时会遇到一些错误或异常情况

复制代码
 a=10

    
 b=0
    
 c=a/b
    
 print("done")

执行上述代码,其输出结果为:

复制代码
 Traceback (most recent call last):

    
   File "d:\Code\learn\poetry-demo\poetry_demo\demo.py", line 3, in <module>
    
     c=a/b
    
 ZeroDivisionError: division by zero

观察到程序因ZeroDivisionError而停止运行,并未执行print("done")语句。为了应对异常情况,在代码中采用try...except结构进行处理即可将上述代码进行优化修改:

复制代码
 a=10

    
 b=0
    
 try:
    
     c=a/b
    
     print(c)
    
 except ZeroDivisionError as e:
    
     print(e)    
    
 print("done")

执行上述代码,其输出结果为:

复制代码
 division by zero

    
 done

这样程序就不会因为异常而中断,从而print("done") 语句正常执行。

将可能引发错误的语句放置于try块中,并通过exception机制进行异常处理。exception不仅可以处理一种特定类型的异常还可以同时管理圆括号内的多个相关类型(如圆括号内包含ZeroDivisionError等)如果在exception块后未指定具体例外类型则默认捕获所有类型的例外每个try都需要配上至少一个相应的exception块例如在以下代码中:

复制代码
 try:

    
     pass
    
 except (IOError,ZeroDivisionError) as e:
    
     print(e)

try...except...else 语句,当没有发生异常时,else中的语句将会执行:

复制代码
 a=10

    
 b=0
    
 try:
    
     c = b/a
    
     print(c)
    
 except (IOError ,ZeroDivisionError) as e:
    
     print(e)
    
 else:
    
     print("no error")
    
 print("done")

执行上述代码,其输出结果为:

复制代码
 0.0

    
 no error
    
 done

、raise引发一个异常****

如果输入的数据不是整数,则引发一个ValueError:

复制代码
 try:

    
     inputValue=input("please input a int data :")
    
     if type(inputValue)!=type(1):
    
     raise ValueError
    
     else:
    
     print(inputValue)
    
 except ValueError as e:
    
     print("输入错误")

如果输入1.2,则运行结果为**“输入错误”**

三、try...finally

无论异常是否发生,在程序结束前,finally中的语句都会被执行:

复制代码
 a=10

    
 b=0
    
 try:
    
     print(a/b)
    
 finally:
    
     print("always excute")

尽管在上述代码中可能出现异常情况,在程序运行过程中,...中的语句依然能够顺利执行。此外,在处理完所有异常后系统会自动执行...中的操作以确保任务顺利完成:

复制代码
 a=10

    
 b=0
    
 try:
    
     print(a/b)
    
 except:
    
     print("error")
    
 finally:
    
     print("always excute")

执行上述代码,其输出结果为:

复制代码
 error

    
 always excute

四、自定义一个异常类

自定义一个MyException类,继承Exception:

复制代码
 class MyException(Exception):

    
     def __init__(self, message) :
    
     Exception.__init__(self)
    
     self.message=message

如果输入的数字小于10,就会引发一个MyException异常:

复制代码
 a=input("please input a num:")

    
 if int(a)<10:
    
     try:
    
     raise MyException("my excepition is raised ")
    
     except MyException as e:
    
     print(e.message)

执行上代码,输入1,其运行结果为:

复制代码
 please input a num:1

    
 my excepition is raised

五、Python所有的标准异常类

复制代码
 异常名称     描述

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

全部评论 (0)

还没有任何评论哟~