当程序出错时,系统会自动抛出异常。另外,Python还允许程序自己引发异常,使用raise语句来完成异常。使用raise引发异常如果你需要在程序中自己引发异常,你应该使用raise语句。raise语句有以下三种常见用法:1.raise:单个raise语句引发当前上下文中捕获的异常(例如在except块中),或者默认引发RuntimeError异常2.raise异常类:raisefollowedbyanexceptionclass,thisstatementraisesthedefaultinstanceofspecifiedexceptionclass3.raiseexceptionobject:引发指定的异常对象可以用try...except来捕获,当然你也可以忽略它,让异常传播向上(第一个来电者)。如果将异常传递给Python解释器,程序将中止。下面的例子演示了两种处理用户引起的异常的方法:从上面的程序可以看出,程序在调用mtd(3)时可以使用try...except来捕获异常,这样异常就会被mtd(3)捕获除了块。它将传播到调用它的函数;也可以直接调用mtd(3),这样这个函数的异常会直接传播到它的调用函数,如果这个函数不处理异常,会导致程序中止。运行上面的程序,输出结果如下:上面第一行的输出是第一次调用mtd(3)的结果,这个方法引发的异常被except块捕获并处理。下面一大段输出是第二次调用mtd(3)的结果。由于异常没有被except块捕获,异常向上传播,直到传递给Python解释器,程序终止。注意:第二次调用mtd(3)导致的以"File"开头的三行输出其实是异常的传播轨迹信息,即如果程序没有处理异常,Python会输出的传播轨迹信息默认情况下控制台上的异常。跟踪信息。**推荐:020持续更新,精品圈每天都有新内容,干货集中度极高。建立联系,讨论技术,你想要的都在这里!成为第一个加入团队并超越同行的人!(入群不收费)点此与Python开发高手交流学习。群号:745895701申请即时发货:Python软件安装包,免费提供Python实用教程资料,包括Python基础学习、进阶学习、爬虫、人工智能、自动化运维、自动化测试等。**自定义异常为用户-definedExceptions应该继承自Exception基类或者Exception的子类。自定义异常类的时候基本不用多写代码。只需要指定自定义异常类的父类即可。如下所示:classAuctionException(Exception):pass上面的程序创建了AuctionException异常类,不需要类体定义,所以pass语句可以作为占位符。同时使用except和raise在实际应用中可能需要更复杂的异常处理——当异常发生时,单独一个方法是无法处理异常的,必须有几个方法相互配合才能完整处理异常。即在当前发生异常的方法中,程序只是对异常进行了部分处理,部分处理还需要在方法的调用者中完成,所以应该再次抛出异常,这样方法的调用者也可以捕获异常。为了实现这种多个方法协同处理同一个异常的情况,可以在结合raise语句的except块中完成,如下:上述程序中AuctionTest类中的except块捕获到异常后,系统打印异常的字符串信息,然后抛出一个AuctionException,通知方法的调用者重新处理AuctionException。因此,程序中的main()函数,即bid()方法的调用者也可以再次捕获AuctionException,打印出异常的详细描述信息。Python的异常传播轨迹异常对象提供了一个with_traceback用于处理异常传播轨迹。查看异常传播轨迹可以追溯异常触发的源头,也可以一路看到异常触发的轨迹。下面的例子:在上面的程序中,main()函数调用了firstMethod(),firstMethod()调用了secondMethod(),secondMethod()调用了thirdMethod(),thirdMethod()直接触发了SelfException。运行上面的程序,你会看到如下结果:可以看出异常是从thirdMethod()函数触发的,传递给secondMethod()函数,再传递给firstMethod()函数,最后传递给main()函数,在main()函数中终止,这个过程就是Python的异常传播轨迹。在实际应用的开发中,大部分可复用的操作都会被分解成一系列的函数或方法调用,因为为了有更好的复用性,每个可复用的代码单元都会被定义为一个函数或方法,逐渐将复杂的任务分解成更小的任务,更易于管理的子任务。由于一个大的业务功能需要通过多个函数或方法来实现,在最终的编程模型中,许多对象会通过一系列的函数或方法调用来进行通信和执行任务。因此,应用程序在运行时,经常会发生一系列的函数或方法调用,从而形成“函数调用栈”,异常的传播则相反:只要异常没有被完全捕获(包括异常被未捕获,或异常处理后)重新引发新的异常),异常从发生异常的函数或方法逐渐传播,先传播到函数或方法的调用者,再传播到函数或方法的调用者函数或方法.......直到最终传递给Python解释器,此时Python解释器会终止程序并打印异常传播轨迹信息。Python专门提供了一个traceback模块来处理异常传播轨迹。使用traceback可以轻松处理Python异常传播痕迹。引入traceback模块后,traceback提供了以下两个常用方法:1.traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件2.format_exc():将异常传播轨迹信息转换为字符串说到这里,你可能会有疑问:从上面的方法中,你看不出它们处理的是哪些异常传播轨迹信息?OK,其实常用的print_exc()就是print_exc([limit[,file]])省略了limit和file这两个参数的形式。其中limit用于限制显示异常传播的层数。比如函数A调用函数B,函数B发生异常。如果指定limit=1,则只显示函数A中发生的异常。如果没有设置limit参数,则默认为Showall。file指定将异常传播轨迹信息输出到指定文件。如果不指定该参数,则默认输出到控制台。例子如下:上面程序中第一行首先导入traceback模块,然后程序使用except捕获程序异常,并使用traceback的print_exc()方法输出异常传播信息,并输出它分别到控制台和指定的文件。运行上面的程序,还可以看到控制台输出了异常传播信息,并且在程序目录下生成了一个log.txt文件,里面也记录了异常传播信息。最后说一下异常处理的规则:一般来说,成功的异常处理应该事先有以下四个目标:1.尽量减少程序代码混乱2.捕获并保留诊断信息3.通知合适的人员4.使用合适的方法结束异常活动
