• Python3基础之异常结构


    自定义异常类

    class ShortInputException(Exception):
        def __init__(self, length, atleast):
            Exception.__init__(self)
            self.length = length
            self.atleast = atleast
    
    try:
        s = input('Please Input --> ')
        if len(s)<3:
            raise ShortInputException(len(s), 3)
    except EOFError:
        print('You input a end mark EOF')
    except ShortInputException as x:
        print('ShortInputException: length is {0:,}, at least is {1:,}'.format(x.length, x.atleast))
    else:
        print('no error and everything is ok.')
    
    Please Input --> yuxingliangEOF
    no error and everything is ok.
    
    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('My exception occurred, value: ', e.value)
    
    My exception occurred, value:  4
    

    0. 断言语句的应用

    assert

    作用:确认条件表达式是否满足,一般和异常处理结构一起使用。

    结构:

    assert 条件表达式, '表达式error时,给出此处的判定字符串提示。'

    a,b = 3, 5
    assert a == b, 'a must be equal to b.' #判定a是否等于b,if a != b,抛出异常
    
    ---------------------------------------------------------------------------
    
    AssertionError                            Traceback (most recent call last)
    
    <ipython-input-7-2ad85e920458> in <module>()
          1 a,b = 3, 5
    ----> 2 assert a == b, 'a must be equal to b.' #判定a是否等于b,if a != b,抛出异常
    
    
    AssertionError: a must be equal to b.
    
    try:
        assert a == b, 'a must be equal to b'
    except AssertionError as reason:
        print('%s:%s'%(reason.__class__.__name__, reason))
    
    AssertionError:a must be equal to b
    

    1. try...except... 结构

    • 如果try子句中的代码引发异常并被except子句捕捉,则执行except子句的代码块;
    • 如果try子句中的代码块没有出现异常,则except子句代码块不执行,继续往后执行。
    try:
        #可能会引发异常的代码,先执行以下试试看
    except:
        #如果try中的代码抛出异常并被except捕捉,则执行此处的代码语句
    
    """代码功能:决策用户输入的是否是一个数字。
    代码功能详细描述:while语句主导的死循环。
    首先要求用户输入,然后就用户的输入进行判定:
    尝试try中的语句
    用户输入正确的数字,将输入的数字字符转换成数字,然后打印出提示信息,break掉循环
    用户输入错误的字符,try中的语句检测到错误,然后被exception捕捉到,马上转到except中的语句执行,打印错误信息
    虽有开始下一步的循环,知道用户输入正确的数字字符,采用break语句终止循环。"""
    while True:
        x = input('Please input: ')
        try:
            x  = int(x)
            print('You have input {0}'.format(x))
            break
        except Exception as e:
            print('Error.')
    
    Please input: a
    Error.
    Please input: 234f
    Error.
    Please input: 6
    You have input 6
    

    2. try...except...else...结构

    try except else
    检测语句 有问题,执行相应的处理代码 不执行else语句
    检测语句 没问题,不执行except语句 执行else下的语句
    try:
        #可能会引发错误的代码
    except Exception as reason:
        #用来处理异常的代码
    else:
        #如果try中的子句代码没有引发异常,就执行此处的代码
    
    while True:
        x = input('Please input: ')
        try:
            x  = int(x)  # 此处是可能引发异常的语句
        except Exception as e:
            print('Error.') # 处理异常的语句
        else:               # 没有异常时,处理的语句
            print('You have input {0}'.format(x))
            break
    
    Please input: a
    Error.
    Please input: b
    Error.
    Please input: 664h
    Error.
    Please input: 666
    You have input 666
    

    3. try...except...finally...结构

    try except finally
    尝试语句 有问题,执行相应的处理代码 始终执行finally语句
    尝试语句 没问题,不执行except语句 始终执行finally语句
    try:
        #可能会引发错误的代码
    except Exception as reason:
        #用来处理异常的代码
    finally:
        #不论try中是否引发异常,始终执行此处的代码
    
    def div(a,b):
        try:
            print(a/b)
        except ZeroDivisionError:
            print('The second parameter cannot be 0.')
        finally:
            print(-1)
    
    div(3,5)
    
    0.6
    -1
    
    div(3,0)
    
    The second parameter cannot be 0.
    -1
    

    如果try子句中的异常没有被except语句捕捉和处理,或者except子句或者else子句中的代码抛出的了异常,
    那么这些异常将会在finally子句执行完毕之后再次抛出异常。

    div('3',5)   
    
    -1
    
    
    
    ---------------------------------------------------------------------------
    
    TypeError                                 Traceback (most recent call last)
    
    <ipython-input-15-dc6751a7464e> in <module>()
    ----> 1 div('3',5)
    
    
    <ipython-input-12-d5530669db53> in div(a, b)
          1 def div(a,b):
          2     try:
    ----> 3         print(a/b)
          4     except ZeroDivisionError:
          5         print('The second parameter cannot be 0.')
    
    
    TypeError: unsupported operand type(s) for /: 'str' and 'int'
    

    4. 捕捉多种异常的结构

    try:
        #可能会引发异常的代码
    except Exception1:
        #处理异常类型1的代码
    except Exception2:
        #处理异常类型2的代码
    except Exception3:
        #处理异常类型3的代码
    .
    .
    .
    
    try:
        x = float(input('Please the first number: '))
        y = float(input('Please the second number: '))
        z = x/y
    except ZeroDivisionError:
        print('the second number isnot 0.')
    except TypeError:
        print('the number must be number.')
    except NameError:
        print('The variable isnot here.')
    else:
        print(x, '/', y, '=', z)
    
    Please the first number: 30
    Please the second number: 5
    30.0 / 5.0 = 6.0
    
    try:
        x = float(input('Please the first number: '))
        y = float(input('Please the second number: '))
        z = x/y
    except (ZeroDivisionError, TypeError, NameError):
        print('Error is catched.')
    else:
        print(x, '/', y, '=', z)
    
    Please the first number: 45
    Please the second number: 0
    Error is catched.
    

    5. 多种结构混合

    def div(x,y):
        try:
            print(x/y)
        except ZeroDivisionError:
            print('ZeroDivisionError')
        except TypeError:
            print('typeerror')
        else:
            print('no error')
        finally:
            print('I am executing finally clause.')
    
    div(3,4)
    
    0.75
    no error
    I am executing finally clause.
  • 相关阅读:
    波特率原理【转】
    求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
    1033. To Fill or Not to Fill (25)
    http协议
    【数据结构与算法】二叉树深度遍历(递归)
    2015届求职经历
    Codeforces Round #245 (Div. 1)——Working out
    泛泰A900 刷4.4专用中文TWRP2.7.1.1版 支持自己主动识别手机版本号(全球首创)
    实现简答LinkedList
    oracle的内存管理(之中的一个)
  • 原文地址:https://www.cnblogs.com/brightyuxl/p/9096622.html
Copyright © 2020-2023  润新知