我们先用一个例子来理解在代码中引入异常处理的原因。print('Start')a=10b=0print(a/b)print('End')执行结果Traceback(最近调用last):File"C:/Users/Kevin/PycharmProjects/PyDemo/p1/exception_demo.py",line4,inprint(a/b)ZeroDivisionError:divisionbyzeroStartProcessfinishedwithexitcode1可以看到代码有问题,结果是可以预料的,但是End没有打印成功,这说明print('end')语句是不执行的,所以一旦程序中出现异常,异常点之后的语句将不会被执行!我们可以使用条件语句来解决这个问题。代码如下:print('Start')a=10b=0ifb!=0:print(a/b)print('End')我们也可以利用python的异常处理机制来解决这个问题。python中捕获异常可以使用try/except语句。try/except语句用于检测try语句块中的错误,以便except语句捕获和处理异常信息。语法:try....except语法,代码如下:print('Start')try:a=10b=0print(a/b)except:print("catchexception")print('End')运行结果startcatchexceptionEnd可以看到try中的代码print(a/b)出现异常被except捕获,然后执行print("catchexception"),最后程序正常执行!说到这里,可能有同学会问,为什么要对一个可以用条件语句解决的问题引入异常机制呢?最简单的解释就是使用异常机制会大大减少代码量。这个例子比较简单,大家可能看不懂。在实际编码中,try中会有很多行代码。只要有错误,就会被捕获!如果使用条件语句,需要在多行代码中进行判断,代码量可想而知!异常的类型也分门别类。处理不同类型的错误,并使用不同的异常类型。python的标准异常包括:BaseException所有异常的基类SystemExit解释器请求退出KeyboardInterrupt用户中断执行Exception通用错误的基类StopIteration迭代器没有更多值GeneratorExit生成器抛出异常信号退出StandardError所有内置标准异常的基类ArithmeticError所有数值计算错误的基类FloatingPointError浮点计算错误OverflowError数值计算超过最大限制ZeroDivisionError除(或模)零(所有数据类型)AssertionError断言语句失败AttributeError对象不有这个属性EOFError没有内置输入,EOF标记到达操作系统错误的EnvironmentError基类IOError输入/输出操作失败OSError操作系统错误WindowsError系统调用失败ImportError导入模块/对象失败LookupError无效数据查询的基类IndexError序列中没有这样的索引KeyError映射中没有这样的键参考)试图访问已被垃圾收集的对象RuntimeError一般运行时错误NotImplementedError方法尚未实现SyntaxErrorPython语法错误IndentationErrorTabError制表符和空格混合SystemError一般解释器系统错误解码时的错误UnicodeEncodeErrorUnicode编码时的错误UnicodeTranslateErrorUnicode转换时的错误Warning警告的基类DeprecationWarningWarning关于已弃用的功能FutureWarning关于其语义可能有问题的构造的警告未来会出现OverflowWarning旧的关于自动升级到longPendingDeprecationWarning的警告关于被弃用的特性的警告RuntimeWarning关于可疑的运行时行为的警告SyntaxWarning关于可疑的语法的警告.例如,不能使用IOError捕获ZeroDivisionError。代码如下:print('Start')try:a=10b=0print(a/b)exceptIOError:print("catchexception")print('End')运行结果StartTraceback(最近一次调用last):File"C:/Users/Kevin/PycharmProjects/PyDemo/p1/exception_demo.py",line5,inprint(a/b)ZeroDivisionError:divisionByzero可以使用except带来多种异常类型,try:正常运行.......except(Exception1,Exception2,...ExceptionN):出现以上异常之一执行这段代码..........try...exceptBaseExceptionasmsg:输出异常信息例如:print('Start')try:a=10b=0print(a/b)exceptBaseExceptionasmsg:print(msg)print('End')output:StartdivisionbyzeroEndtry...except...finally这条语句的意思是是否发生异常finally都会执行finally中的代码,示例代码如下:print('Start')try:a=10b=0print(a/b)except:print('exception')finally:print("finally")print('End')output:StartexceptionfinallyEndthrowsanexceptionraise语句允许程序员强制指定异常发生。如果您需要确定是否引发异常但不打算处理它,则很有用!例如:defexp_fuc():raiseIOErrorexp_fuc()print('End')runningresultTraceback(mostrecentcalllast):File"C:/Users/Kevin/PycharmProjects/PyDemo/p1/except_demo2.py",line7,inexp_fuc()File"C:/Users/Kevin/PycharmProjects/PyDemo/p1/except_demo2.py",line5,inexp_fucraiseIOErrorOSError可以看到代码抛出了IOError,因为没有被捕获,所以print('End')未捕获实现自定义异常例程可以通过创建新的异常类来命名自己的异常。异常通常应该直接或间接地从Exception类派生。defexp_fuc():raiseIOErrorexp_fuc()print('End')运行结果Myexception:我的错误
