精华内容
下载资源
问答
  • try except

    千次阅读 2014-05-29 20:53:58
    try-except用法  try except是windows 系统独有的异常处理模型,windows的异常处理模式,称为SEH( structured exception handling ),  SEH的异常处理模型主要由try-except语句来完成,与标准的try catch...

    try-except用法

      try except是windows 系统独有的异常处理模型,windows的异常处理模式,称为SEH( structured exception handling ),

           SEH的异常处理模型主要由try-except语句来完成,与标准的try catch相似。与C++异常处理模型使用catch关键字来定义异常处理模块,而SEH是采用__except关键

    字来定义。并且,catch关键字后面往往好像接受一个函数参数一样,可以是各种类型的异常数据对象;但是__except关键字则不同,它后面跟的却是一个表达式.

    我们知道,函数调用也是一个表达式。

        我们来看下面这个例子,这个例子是用来处理栈溢出的异常。    

    long WINAPI FilterFunc(DWORD dwExceptionCode)

    {

    return (dwExceptionCode == STATUS_STACK_OVERFLOW) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;

    }

    UINT WINAPI ThreadFunc(LPVOID param)

    {

    __try

    {

                       // guarded code 

    }

    __except (FilterFunc(GetExceptionCode()))

    {

    // 如果是栈溢出,进行处理。

    }

     

        return  TRUEt;    

    }

    except参数的值有以下三种:

           EXCEPTION_CONTINUE_EXECUTION (–1)     异常被忽略,控制流将在异常出现的点之后,继续恢复运行。

      EXCEPTION_CONTINUE_SEARCH (0)          异常不被识别,也即当前的这个__except模块不是这个异常错误所对应的正确的异常处理模块。系统将继续到上一try-

    except域中继续查找一个恰当的__except模块。

      EXCEPTION_EXECUTE_HANDLER (1)         异常已经被识别,控制流将进入到__except模块中运行异常处理代码

    try-except的关键是如何在__except模块中获得异常错误的相关信息.

    Windows提供了两个API函数来获取异常信息:

    LPEXCEPTION_POINTERS GetExceptionInformation(VOID); //取得异常相关信息

    DWORD GetExceptionCode(VOID); // 取得异常编号

    GetExceptionCode()返回异常编号,而GetExceptionInformation()返回更丰富的信息,EXCEPTION_POINTERS结构如下,

    typedef struct _EXCEPTION_POINTERS { // exp 

    PEXCEPTION_RECORD ExceptionRecord; 

    PCONTEXT ContextRecord; 

    } EXCEPTION_POINTERS;

    其中EXCEPTION_RECORD类型,它记录了一些与异常相关的信息;而CONTEXT数据结构体中记录了异常发生时,线程当时的上下文环境,主要包括寄存器的值。

    有了这些信息,__except模块便可以对异常错误进行很好的分类和恢复处理,通常我们需要一个过滤函数来辅助。一般称为是filterfunction.过滤函数只过滤需要处

    理的异常。

    int exception_access_violation_filter(LPEXCEPTION_POINTERS p_exinfo)

    {

        if(p_exinfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)

        {

            messagebox("access vialation exceptionn");

           return EXCEPTION_EXECUTE_HANDLER ; //告诉except处理这个异常

        }

        else return EXCEPTION_CONTINUE_SEARCH; //不告诉except处理这个异常

    }

    int exception_int_divide_by_zero_filter(LPEXCEPTION_POINTERS p_exinfo)

    {

        if(p_exinfo->ExceptionRecord->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO)

        {

            return  EXCEPTION_EXECUTE_HANDLER; //告诉except处理这个异常

        }

       else return EXCEPTION_CONTINUE_SEARCH; //不告诉except处理这个异常

    }

    于是,你可以这样写这段异常处理代码:

    __try

    {

      // guarded code

    }

    __except(exception_access_violation_filter(GetExceptionInformation()))

    {

    //

    }

    __try

    {

      // guarded code

    }

    __exceptexception_int_divide_by_zero_filter(GetExceptionInformation()))

    {

    //exception handling

    }

    SEH异常处理模型中,也可以抛出一个异常。对应的WindowsAPI函数是RaiseException,

    VOID RaiseException(

    DWORD dwExceptionCode, // 异常的编号

    DWORD dwExceptionFlags, // 异常标记

    DWORD nNumberOfArguments, // 参数个数

    CONST DWORD *lpArguments //  参数数组首地址

    );

    通常,后三个参数基本不用

    SEH异常处理还有try-finally.类似于java里的try-catch-finally.但是SEH的try只能和except和finally两者之间的一个搭配,不能有try-except-finnaly. 

     C++异常模型用try-catch语法定义,而SEH异常模型则用try-except语法,与C++异常模型相似,try-except也支持多层的try-except嵌套。

     try-except模型中,一个try块只能是有一个except块;而C++异常模型中,一个try块可以有多个catch块。

     C++异常模型是按照异常对象的类型来进行匹配查找的;而try-except模型则不同,它通过一个表达式的值来进行判断.

      __except关键字后面跟的表达式,它可以是各种类型的表达式,例如,它可以是一个函数调用,或是一个条件表达式,或是一个逗号表达式,或干脆就是一个整

    型常量等等。最常用的是一个函数表达式,并且通过利用GetExceptionCode()或GetExceptionInformation ()函数来获取当前的异常错误信息,便于程序员有效控制异常

    错误的分类处理。

    SEH异常处理模型中,异常通过RaiseException()函数抛出。RaiseException()函数的作用类似于C++异常模型中的throw。

    关于SEH异常处理更详细的资料,你可以去看windows via c/c++这本书,中文译名是windows核心编程。不过还是建议你看英文原版,翻译的版本质量不高。

    展开全文
  • 在原本的try except结构的基础上,Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。使用 else 包裹的代码,只有当 try 块没有捕获到任何...

    de647c02a396977619bd098b86c54b45.png

    在原本的try except结构的基础上,Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。

    使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;反之,如果 try 块捕获到异常,即便调用对应的 except 处理完异常,else 块中的代码也不会得到执行。

    举个例子:

    try:

    result = 20 / int(input("请输入除数:"))

    print(result)

    except ValueError:

    print("必须输入整数")

    except ArithmeticError:

    print("算术错误,除数不能为 0")

    else:

    print("没有出现异常")

    print("继续执行")

    可以看到,在原有 try except 的基础上,我们为其添加了 else 块。现在执行该程序:

    请输入除数:4

    5.0

    没有出现异常

    继续执行

    如上所示,当我们输入正确的数据时,try 块中的程序正常执行,Python 解释器执行完 try 块中的程序之后,会继续执行 else 块中的程序,继而执行后续的程序。

    读者可能会问,既然 Python 解释器按照顺序执行代码,那么 else 块有什么存在的必要呢?直接将 else 块中的代码编写在 try except 块的后面,不是一样吗?

    当然不一样,现在再次执行上面的代码:

    请输入除数:a

    必须输入整数

    继续执行

    可以看到,当我们试图进行非法输入时,程序会发生异常并被 try 捕获,Python 解释器会调用相应的 except 块处理该异常。但是异常处理完毕之后,Python 解释器并没有接着执行 else 块中的代码,而是跳过 else,去执行后续的代码。

    也就是说,else 的功能,只有当 try 块捕获到异常时才能显现出来。在这种情况下,else 块中的代码不会得到执行的机会。而如果我们直接把 else 块去掉,将其中的代码编写到 try except 的后面:

    try:

    result = 20 / int(input("请输入除数:"))

    print(result)

    except ValueError:

    print("必须输入整数")

    except ArithmeticError:

    print("算术错误,除数不能为 0")

    print("没有出现异常")

    print("继续执行")

    程序执行结果为:

    请输入除数:a

    必须输入整数

    没有出现异常

    继续执行

    可以看到,如果不使用 else 块,try 块捕获到异常并通过 except 成功处理,后续所有程序都会依次被执行。

    python  try except else finally 实例

    class AError(Exception):

    """AError---exception"""

    print("AError")

    class BError(Exception):

    """BError---exception"""

    print("BError")

    try:

    # raise AError

    # raise BError

    aaaaa()

    except AError:

    print("Get AError")

    except BError:

    print("Get BError")

    except:

    print("Get Exception")

    else:

    print("do else")

    finally:

    print("finally")

    1.在上面所示的完整语句中try/except/else/finally所出现的顺序必须是try-->except X-->except-->else-->finally,即所有的except必须在else和finally之前,else(如果有的话)必须在finally之前,而except X必须在except之前。否则会出现语法错误。

    2.在上面的完整语句中,else语句的存在必须以except X或者except语句为前提,如果在没有except语句的try block中使用else语句会引发语法错误。也就是说else不能与try/finally配合使用。

    3.try成功进else,不成功进对应的except;

    4.不论是否成功except X,except的判定语句都会执行,只是不进入;对应到以上程序就是不论哪种情况 AError BError都会打印,但是Get AError Get BError 只有抛对应的异常时才会打印。

    5.finally所有情况都会执行,可以不写,写了就必须在所有except else等之后;

    到此这篇关于Python try except else使用详解的文章就介绍到这了,更多相关Python try except else内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

    展开全文
  • 实际上,python中一个完整的异常处理语句是try except else finally。在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。try except else finally可以让我们的思维更加...

    实际上,python中一个完整的异常处理语句是try except else finally。在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。try except else finally可以让我们的思维更加周密,条例更清晰。

    写了finally后,finally的代码部分不管try中的程序是否抛出异常总要去执行。一些场景比如打开文件后不管如何操作最终都要关闭文件,链接数据库后不管如何操作最终都要关闭连接。

    与else不同的是finally可以和try一个人搭配使用。

    # -*- coding: utf-8 -*-

    try:

    print('吃早饭')

    print('吃午饭')

    print('吃完饭')

    print('和{0}约会'.format(name))

    except NameError as e:

    print('出错!打印未定义变量',e)

    except IndexError as e:

    print('出错!列表索引异常',e)

    except:

    print('未知异常')

    else:

    print('今天一切顺利')

    finally:

    print('该睡觉了')

    吃早饭

    吃午饭

    吃完饭

    出错!打印未定义变量 name 'name' is not defined

    该睡觉了

    # -*- coding: utf-8 -*-

    try:

    print('和{0}约会'.format(name))

    finally:

    print('该睡觉了')

    该睡觉了

    Traceback (most recent call last):

    File "D:/pyscript/py3script/python66/python66.py", line 4, in

    print('和{0}约会'.format(name))

    NameError: name 'name' is not defined

    展开全文
  • Python 异常处理详解。 获取异常信息的方法,try except 详解,try except else 详解,try except finally 详解。

    您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

    如意见相佐,可留言。
    本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

    1 try except 详解

    1.1 try except 概述

    Python 中,用 try except 语句块捕获并处理异常。

    当程序发生不同的意外情况时,会对应特定的异常类型,Python 解释器会根据该异常类型选择对应的 except 块来处理该异常。

    注意:不管程序代码块是否处于 try 块中,甚至包括 except 块中的代码,只要执行该代码块时出现了异常,系统都会自动生成对应类型的异常。但是,如果此段程序没有用 try 包裹,又或者没有为该异常配置处理它的 except 块,则 Python 解释器将无法处理,程序就会停止运行;如果程序发生的异常经 try 捕获并由 except 处理完成,则程序可以继续执行。

    基本语法结构如下所示:

    try:
        代码块1  # 可能产生异常的代码块,有且仅有一个
    except [(Error1, Error2, ... ) [as e]]:
        代码块2  # 处理异常的代码
    except [(Error3, Error4, ... ) [as e]]:
        代码块3  # 处理异常的代码
    ...  # 可以有多个 except 块
    except [Exception]:
        代码块4  # 处理其他异常的代码
    

    对以上格式说明,

    • []:中括号括起来的为可选内容,可有可无。
    • (Error1, Error2,...) 、(Error3, Error4,...):都是具体的异常类型。一个 except 块可以同时处理多种异常。
    • [as e]:表示给异常类型起一个别名 e,这样做的好处是方便在 except 块中调用异常类型。
    • [Exception]:可以表示程序可能发生的所有异常情况,其通常用在最后一个 except 块。
    • try except 语句的执行流程如下所示,
      (1)捕获异常:首先执行 try 中的代码块,如果执行过程中出现异常,系统会自动生成一个异常类型,并将该异常提交给 Python 解释器,此过程称为捕获异常。
      (2)处理异常:当 Python 解释器收到异常对象时,会寻找能处理该异常对象的 except 块,如果找到合适的 except 块,则把该异常对象交给该 except 块处理,这个过程被称为处理异常。
      (3)终止程序:如果 Python 解释器找不到处理异常的 except 块,则程序运行终止,Python 解释器也将退出。

    举例如下所示:

    例一,正常情况

    try:
        # 可能出现异常的代码块
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        c = a / b
        print("相除的商为:", c)
    except (ValueError, ArithmeticError):  # ZeroDivisionError 是 ArithmeticError 的子类
        # 处理异常的代码块
        print("程序发生了数字格式异常、算术异常之一")
    except :  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print("未知异常")
    # try except 外的代码
    print("程序继续运行")
    
    

    运行结果:

    请输入被除数:6
    请输入除数:2
    相除的商为: 3.0
    程序继续运行
    

    例二,触发异常

    try:
        # 可能出现异常的代码块
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        c = a / b
        print("相除的商为:", c)
    except (ValueError, ArithmeticError):  # ZeroDivisionError 是 ArithmeticError 的子类
        # 处理异常的代码块
        print("程序发生了数字格式异常、算术异常之一")
    except :  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print("未知异常")
    # try except 外的代码
    print("程序继续运行")
    
    

    运行结果:

    请输入被除数:阿杰
    程序发生了数字格式异常、算术异常之一
    程序继续运行
    

    例三,触发异常

    try:
        # 可能出现异常的代码块
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        c = a / b
        print("相除的商为:", c)
    except (ValueError, ArithmeticError):  # ZeroDivisionError 是 ArithmeticError 的子类
        # 处理异常的代码块
        print("程序发生了数字格式异常、算术异常之一")
    except :  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print("未知异常")
    # try except 外的代码
    print("程序继续运行")
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    程序发生了数字格式异常、算术异常之一
    程序继续运行
    

    1.2 获取异常信息的方式

    (1)通过异常类提供的属性和方法获取异常信息

    每种异常类型都提供了如下几个属性和方法,通过调用它们,就可以获取当前处理异常类型的相关信息:

    • args:返回异常的错误编号和描述字符串;
    • str(e):返回异常信息,但不包括异常信息的类型;
    • repr(e):返回较全的异常信息,包括异常信息的类型。

    举例如下所示:

    在例二的基础上,添加获取异常信息的代码

    try:
        # 可能出现异常的代码块
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        c = a / b
        print("相除的商为:", c)
    except (ValueError, ArithmeticError) as e:  # ZeroDivisionError 是 ArithmeticError 的子类
        # 处理异常的代码块
        print("程序发生了数字格式异常、算术异常之一")
        print('通过 e.args 获取异常信息为:', e.args)
        print('通过 str(e) 获取异常信息为:', str(e))
        print('通过 repr(e) 获取异常信息为:', repr(e))
    except :  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print("未知异常")
    # try except 外的代码
    print("程序继续运行")
    
    

    运行结果:

    请输入被除数:阿杰
    程序发生了数字格式异常、算术异常之一
    通过 e.args 获取异常信息为: ("invalid literal for int() with base 10: '阿杰'",)
    通过 str(e) 获取异常信息为: invalid literal for int() with base 10: '阿杰'
    通过 repr(e) 获取异常信息为: ValueError("invalid literal for int() with base 10: '阿杰'")
    程序继续运行
    

    在例三的基础上,添加获取异常信息的代码

    try:
        # 可能出现异常的代码块
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        c = a / b
        print("相除的商为:", c)
    except (ValueError, ArithmeticError) as e:  # ZeroDivisionError 是 ArithmeticError 的子类
        # 处理异常的代码块
        print("程序发生了数字格式异常、算术异常之一")
        print('通过 e.args 获取异常信息为:', e.args)
        print('通过 str(e) 获取异常信息为:', str(e))
        print('通过 repr(e) 获取异常信息为:', repr(e))
    except :  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print("未知异常")
    # try except 外的代码
    print("程序继续运行")
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    程序发生了数字格式异常、算术异常之一
    通过 e.args 获取异常信息为: ('division by zero',)
    通过 str(e) 获取异常信息为: division by zero
    通过 repr(e) 获取异常信息为: ZeroDivisionError('division by zero')
    程序继续运行
    

    (2)使用 Python sys.exc_info() 方法获取异常信息

    sys 模块中,有两个方法可以返回异常的全部信息,分别是 exc_info()last_traceback(),这两个函数有相同的功能和用法。

    exc_info()方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别如下所示:

    • type:异常类型的名称,它是 BaseException 的子类。
    • value:捕获到的异常实例。
    • traceback:是一个 traceback 对象。

    举例如下所示:

    import sys  # 导入 sys 模块
    
    def demo1(a, b):
            c = a / b
            print("相除的商为:", c)
    
    
    def demo2(a, b):
        demo1(a, b)
    
    
    def demo3(a, b):
        demo2(a, b)
    
    
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        demo3(a, b)
    except:  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print(sys.exc_info())
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x000002626F40CE00>)
    

    无法直接看出有关异常的信息,还需要对 traceback 对象做进一步处理。

    要查看 traceback 对象包含的内容,需要先引进 traceback 模块,然后调用 traceback 模块中的 print_tb() 方法,并将 sys.exc_info() 作为参数传入。

    举例如下所示:

    import sys  # 导入 sys 模块
    import traceback  # 导入 traceback 模块
    
    
    def demo1(a, b):
            c = a / b
            print("相除的商为:", c)
    
    
    def demo2(a, b):
        demo1(a, b)
    
    
    def demo3(a, b):
        demo2(a, b)
    
    
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        demo3(a, b)
    except:  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print(sys.exc_info())
        traceback.print_tb(sys.exc_info()[2])  # 进一步处理
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x0000025DC895CB40>)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 33, in <module>
        demo3(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 27, in demo3
        demo2(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 23, in demo2
        demo1(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 18, in demo1
        c = a / b
    
    

    (3)使用 Python traceback 模块获取异常信息

    traceback模块可以用来查看异常的传播轨迹,追踪异常触发的源头。

    应用程序运行时,经常会发生一系列函数或方法调用。异常的传播则相反,只要异常没有被完全捕获(包括异常没有被捕获,或者异常被处理后重新引发了新异常),异常就从发生异常的函数或方法逐渐向外传播,首先传给该函数或方法的调用者,该函数或方法的调用者再传给其调用者,直至最后传到 Python 解释器,此时 Python 解释器会中止该程序,并打印异常的传播轨迹信息。

    建议:从最后一行异常信息开始看,最后一行信息详细显示了异常的类型和异常的详细消息。从这一行向上,逐个记录了异常发生源头、异常依次传播所经过的轨迹,并标明异常发生在哪个文件、哪一行、哪个函数处。

    使用 traceback 模块查看异常传播轨迹,首先需要将 traceback 模块引入,该模块提供了如下两个常用方法:

    • print_exc([limit[, file]]):将异常传播轨迹信息输出到控制台或指定文件中。
      (1) limit:用于限制显示异常传播的层数,比如函数 A 调用函数 B,函数 B 发生了异常,如果指定 limit=1,则只显示函数 A 里面发生的异常。如果不设置 limit 参数,则默认全部显示。
      (2) file:指定将异常传播轨迹信息输出到指定文件中。如果不指定该参数,则默认输出到控制台。
    • format_exc():将异常传播轨迹信息转换成字符串。和 print_exc() 效果是一样的。

    举例如下所示:

    例一,print_exc()

    import traceback  # 导入 traceback 模块
    
    
    def demo1(a, b):
            c = a / b
            print("相除的商为:", c)
    
    
    def demo2(a, b):
        demo1(a, b)
    
    
    def demo3(a, b):
        demo2(a, b)
    
    
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        demo3(a, b)
    except:  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        traceback.print_exc()
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    Traceback (most recent call last):
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 30, in <module>
        demo3(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 24, in demo3
        demo2(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 20, in demo2
        demo1(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 15, in demo1
        c = a / b
    ZeroDivisionError: division by zero
    

    例二,format_exc()

    import traceback  # 导入 traceback 模块
    
    
    def demo1(a, b):
            c = a / b
            print("相除的商为:", c)
    
    
    def demo2(a, b):
        demo1(a, b)
    
    
    def demo3(a, b):
        demo2(a, b)
    
    
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        demo3(a, b)
    except:  # 未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表示可捕获所有类型的异常,一般会作为异常捕获的最后一个 except 块。
        print(traceback.format_exc())
    
    

    运行结果:

    请输入被除数:6
    请输入除数:0
    Traceback (most recent call last):
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 30, in <module>
        demo3(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 24, in demo3
        demo2(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 20, in demo2
        demo1(a, b)
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 15, in demo1
        c = a / b
    ZeroDivisionError: division by zero
    

    2 try except else 详解

    使用 else 包裹的代码,只有当 try 块没有捕获到任何异常时,才会得到执行;
    如果 try 块捕获到异常,即便调用对应的 except 处理完异常,else 块中的代码也不会得到执行。

    举例如下所示:

    例一,else 块执行

    import traceback
    try:
        res = 10 / int(input('请输入一个除数:'))
        print(res)
    except:
        traceback.print_exc()
    else:
        print('else 块执行。')
    
    

    运行结果:

    请输入一个除数:2
    5.0
    else 块执行。
    

    例二,else 块不执行

    import traceback
    try:
        res = 10 / int(input('请输入一个除数:'))
        print(res)
    except:
        traceback.print_exc()
    else:
        print('else 块执行。')
    
    

    运行结果:

    请输入一个除数:0
    Traceback (most recent call last):
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 3, in <module>
        res = 10 / int(input('请输入一个除数:'))
    ZeroDivisionError: division by zero
    

    3 try except finally 详解

    Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。例如,当 try 块中的程序打开了一些物理资源(文件、数据库连接等)时,由于这些资源必须手动回收,而回收工作通常就放在 finally 块中,这是一种比较好的选择。Python 垃圾回收机制,只能帮我们回收变量、类对象占用的内存,而无法自动完成类似关闭文件、数据库连接等这些的工作。

    无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。

    注意:finally 语句和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。

    举例如下所示:

    例一,没触发异常

    import traceback
    try:
        res = 10 / int(input('请输入一个除数:'))
        print(res)
    except:
        traceback.print_exc()
    else:
        print('else 块执行。')
    finally:
        print('finally 块执行。')
    
    

    运行结果:

    请输入一个除数:2
    5.0
    else 块执行。
    finally 块执行。
    

    例二,触发异常

    import traceback
    try:
        res = 10 / int(input('请输入一个除数:'))
        print(res)
    except:
        traceback.print_exc()
    else:
        print('else 块执行。')
    finally:
        print('finally 块执行。')
    
    

    运行结果:

    请输入一个除数:0
    finally 块执行。
    Traceback (most recent call last):
      File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 3, in <module>
        res = 10 / int(input('请输入一个除数:'))
    ZeroDivisionError: division by zero
    

    【友情链接】

    微信公众号:码农阿杰

    博客园

    【参考资料】

    Python 官网

    Python 3.8.2 documentation

    展开全文
  • Python try else异常处理教程在在我们使用 try except else 结构时,同样可以使用 finally 分支,表示一定要执行的代码逻辑。Python try except else语句详解语法try:# 需要检测异常的代码except Exception:# 异常...
  • 在 Python 中,还有另一种异常处理结构,就是 try except else 语句,也就是在原来 try except 语句的基础上再添加一个 else 子句,其作用是指定当 try 块中没有发现异常时要执行的代码。换句话说,当 try 块中发现...
  • 注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。在整个异常处理机制中,finally 语句的功能是:...
  • 注意,和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。在整个异常处理机制中,finally 语句的功能是:...
  • python异常处理中,在try except的基础上还提供了else代码块,如果try代码块中的程序未发生异常,执行完毕后会继续执行else代码块的内容。如果try代码块部分发生异常,则进入except部分处理异常无缘进入else部分。从...
  • python中try/except/else/finally语句的完整格式如下所示:try:Normal execution blockexcept A:Exception A handleexcept B:Exception B handleexcept:Other exception handleelse:if no exception,get herefinally...
  • try except else

    2019-03-25 13:33:00
    try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。例如: for arg in sys.argv[1:]: try: f = open(arg, 'r') ...
  • try except 用法

    2020-08-06 09:07:16
    假设有一个文件当中存了几个学生的成绩,格式如下: ...(使用try except语句) chengji = 'Tom 96 Jack 95 Jimmy 93 Andy 94 Rose 99' shuzu = chengji.split() i = 1 s = 0 k = 0 while True: try: s =
  • Python try except else使用详解,除数,异常,语句,代码,程序Python try except else使用详解易采站长站,站长之家为您整理了Python try except else使用详解的相关内容。在原本的try except结构的基础上,Python 异常...
  • 本文实例讲述了Python使用try except处理程序异常的三种常用方法。分享给大家供大家参考,具体如下:如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序:try:语句1...
  • 在原本的try except结构的基础上,Python 异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。使用 else 包裹的代码,只有当 try 块没有捕获到任何...
  • python 异常处理 try except
  • Delphi Try Except 实例

    千次阅读 2018-11-02 11:03:18
    try  except  raise Exception.Create('123');  exit;  end;    try  except  ShowMessage(Exception(ExceptObject).Message);  exit;  end;   try except on e:Exception do be...
  • tryexcept有时候我们写程序的时候,会出现一些错误或异常,导致程序终止。使用tryexcept,这样程序就不会因为异常而中断。把可能发生错误的语句放在try模块里,用except来处理异常。except可以处理一个专门的...
  • 以上这篇python try except 捕获所有异常的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:python中异常捕获方法详解python traceback捕获并打印...
  • 主要介绍了Python try except异常捕获机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 在原本的try except结构的基础上,Python异常处理机制还提供了一个 else 块,也就是原有 try except 语句的基础上再添加一个 else 块,即try except else结构。 使用 else 包裹的代码,只有当 try 块没有捕获到任何...
  • windows异常处理 try except

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,969
精华内容 10,787
关键字:

tryexcept