Python异常处理和自定义异常

09/29 Python基础 阅读 43 views 次 人气 0
摘要:

Python提供了,异常处理和断言(Assertions)功能来处理程序在运行中出现的异常和错误。

Python标准异常:

BaseException->所有异常的基类

SystemExit->解释器请求退出

KeyboardInterrupt->用户中断执行(通常是输入^C)

Exception->常规错误的基类

StopIteration->迭代器没有更多的值

GeneratorExit->生成器(generator)发生异常来通知退出

StandardError->所有的内建标准异常的基类

ArithmeticError->所有数值计算错误的基类

FloatingPointError->浮点计算错误

OverflowError->数值运算超出最大限制

ZeroDivisionError->除(或取模)零 (所有数据类型)

AssertionError->断言语句失败

AttributeError->对象没有这个属性

EOFError->没有内建输入,到达EOF 标记

EnvironmentError->操作系统错误的基类

IOError->输入/输出操作失败

OSError->操作系统错误

WindowsError->系统调用失败

ImportError->导入模块/对象失败

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->用户代码生成的警告


try:
    fh = open("testfile", "w")
    fh.write("test except!!!")
except IOError:
    print ("Error: not found file or read file error")
else:
    print("内容写入文件成功")
    fh.close()
    
输出:
内容写入文件成功

结论:

try:

    正常的操作

except:

    发生异常,执行这块代码

else:

    如果没有异常执行这块代码


try:
    fh = open("testfile", "w")
    try:
        fh.write("test except!!!")
    finally:
        print("关闭文件")
        fh.close()
except IOError:
    print("Error: 没有找到文件或读取文件失败")
    
输出:
关闭文件

结论:

1、当在try块中抛出一个异常,立即执行finally块代码。

2、finally块中的所有语句执行后,异常被再次触发,并执行except块代码。


# 定义函数
def convertInt(var):
    try:
        return int(var)
    except Argument as e:
        print("参数没有包含数字\n", e)
    except ValueError as e:
        print("参数没有包含数字\n", e)
convertInt("what21");

输出:
Traceback (most recent call last):
  File "D:/ProgramData/PycharmProjects/01.BasicKnowledge/04.Exception/main.py", line 4, in convertInt
    return int(var)
ValueError: invalid literal for int() with base 10: 'what21'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/ProgramData/PycharmProjects/01.BasicKnowledge/04.Exception/main.py", line 9, in <module>
    convertInt("what21");
  File "D:/ProgramData/PycharmProjects/01.BasicKnowledge/04.Exception/main.py", line 5, in convertInt
    except Argument as e:
NameError: name 'Argument' is not defined
class MyError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)
try:
    raise MyError(2*2)
except MyError as e:
    print('抛出自定义异常, value:', e.value)
    
输出:
抛出自定义异常, value: 4

结论:

1、通过继承Exception类,来创建一个新的Exception类,可以直接继承或者间接继承。

2、raise指定了要被抛出的异常。


评论

该文章不支持评论!

分享到: