第五章:Python之异常处理

Python之异常处理

序言:异常不可能避免

未实现和为实现异常:
    NotImplemented:未实现;是个单值,NotImplementedType类的实例
        源码:NotImplemented = None # (!) real value is ''
    NotImplementedError:是个类,异常类,返回type

错误和异常概念:
*异常是可以捕获、并被处理的
*错误是不可能被捕获的

一个健壮的程序:尽可能的避免错误;同时尽可能的捕获、处理各种异常;

异常的产生:
    *raise 语句显式的抛出异常
        raise 本身就是一个异常,抛出运行时异常。
        raise 后面给出异常类,如果没有参数,会进行无参构造,只有 raise 会进行无参构造
        raise 后要求应该是BaseException类的子类或实例,如果是类,将被无参实例化
    *Python解释器自己检测到异常并引发它

异常捕获的原则:
    *从小到大,从具体到宽泛(先具体捕获,最后才宽泛捕获)

异常的捕获定义:
try:
    待捕获异常的代码块
except [异常类型]:
    异常的处理代码块

    代码示例:
    try:
        # pass # 如果是pass就没有异常
        raise IndexError
    except: # 捕获异常处理
        print('one')


BaseException 及子类:
    BaseException:所有内建异常类的基类

    示例代码:
        import sys

        try:
            sys.exit(100)
        except SystemExit:
            print('Sysexit')
        print('outre')
    Exception 及子类:
        Exception是所有内建的、非系统退出的异常的基类,自定义异常应该继承自它

    示例代码:
        class MyException(Exception):
            pass

        try:
            1/0
            raise MyException()
        except MyException:
            print('catch the MyExcetpion')
        except ZeroDivisionError:
            print('ZeroDivisionError')
        except Exception:
            print('Exception')
as 子句:
    *被抛出的异常,应该是异常的实例对象,使用as子句可以获取这个对象

    示例代码:
        class MyException(Exception):

            def __init__(self, code, message):
                self.code = code
                self.message = message
    try:
        # 1/0
        # raise MyException() # MyException实例需要2个参数,否则MyException实例化时就抛出一个异常
        raise MyException(22, 'job')
    except MyException as ob:
        print('catch the MyExcetpion', ob.args, ob.code)
    except ZeroDivisionError as ob:
        print('ZeroDivisionError', ob)
    except Exception as ob:
        print('Exception', ob)

finally 子句:
    *finally;最后一定要执行的,并且不管是否发生了异常,都要执行finally的部分。

        示例代码:
                class MyException(Exception):

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


                try:
                    # 1/0
                    raise MyException(22, 'job')
                except MyException as ob:
                    print('catch the MyExcetpion', ob.args, ob.code)
                except ZeroDivisionError as ob:
                    print('ZeroDivisionError', ob)
                except Exception as ob:
                    print('Exception', ob)
                finally:
                    print('-----end-----')
异常总结:
    *异常总是向外层抛出,如果外层没有处理这个异常,就会继续向外抛出
        **如果内层捕获并处理了异常,外部就不能捕获到了
        **如果到了最外层还是没有被处理,就会中断异常所在的线程的执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值