当前位置: 首页 > 科技观察

总结一下Python异常处理的三个重要知识点

时间:2023-03-15 20:38:43 科技观察

帮助过很多人修电脑,排除硬件问题,排除系统问题,网络问题等等。在修电脑的过程中,比如如果电脑不能开机,我会假设它的一个配件坏了,开始对电源、CPU、内存、主板等一一检查,看是哪一个配件坏了。附件有问题。如果操作系统速度变慢,您也可以使用类似的方法。首先检查当前占用的进程是否被不必要的启动,是否有病毒,系统是否没有优化等等。其实在编程的过程中,我们写代码的时候也是假设某段代码的某个功能可能有问题。今天主要讲一下Python语言的异常处理知识。异常捕获首先我们来看一个例子:我让Python解释器通过print(a)向我报告异常,其中包含了错误信息的所有上下文信息,代码路径,错误代码内容,错误信息等。原因为什么语句print(a)是错误的是变量a没有定义(NameError:name'a'isnotdefined),这个在我写代码之前就很清楚了。但是,在实际的编程过程中,随着代码量的增加,有时我们并不确定一个变量是否赋值成功。会直接报错。有两种方法可以解决这个问题:在对变量进行操作(如加减法)之前,检查变量的值是否已经存在。它会将错误信息告诉用户,结果没有太大变化。今天主要讲第二种方法,自动异常捕获法。下面我们修改一下刚才的代码,捕获异常并自定义处理方式:上面的代码示例,我们通过异常捕获tryexcept的语法来捕获错误,并自定义其输出内容。下面来解释一下这段代码:try是用来定义一个语法块来捕获异常的。在try缩进块中,我们可以正常编写我们想要实现的代码。在except块中,我们定义了程序报错时要执行的代码。本例直接打印错误信息(错误信息:name'a'isnotdefined)。except后面的Exceptionase的作用是定义错误信息类型(Exception),并将错误信息赋值给变量e。通过在代码的任何地方使用try...except语法,我们可以设置多个try...except代码块。如果程序正常执行而没有在try中报错,程序会跳过except块。正常执行代码后。异常类型我们刚才使用了Exception这个异常类型,它是Python中一般错误的基类。如果我们不确定可能出现的错误类型,可以使用它,但一般不推荐使用。之所以不直接使用Exception,是因为当我们捕获异常时,总是希望能够清楚地报告或处理异常。如果所有的错误都是Exception类型,我们其实并不知道程序哪里出了问题。举个例子来说明这个问题。通过上面的例子,我们可以了解到两件事:except和try是一对多的,有一个try语句,可以有一个或多个except语句,用于定义任何异常类型和相关处理代码时发生异常捕获后,程序会中断执行,停留在第一次报异常的位置。在这个例子中,因为我们的importxxx实际上引入了一个不存在的模块名,所以程序报错Nomodulenamed'xxx',错误类型为ImportError。现在让我们尝试删除importxxx。现在程序报类型错误(TypeError),因为int类型的数据不能和str类型的数字相加。下面我给出一张Python中常见的异常错误类型表,供大家参考。主动抛出异常上面我们说了Python是如何被动捕获异常的,现在说说主动抛出异常的方法。为什么我们要主动抛出异常?通常,我们通过tryexcept捕获的异常称为被动捕获,实际上需要程序员来处理,比如对错误的变量内容做一些修正,让它继续执行。但是主动抛出的异常通常不需要处理。程序员已经确定这个地方一定要向用户抛出异常,中断程序的执行。基于这种情况,程序员就不需要再处理异常了。让我们看一个例子:在这段代码中,我们将a定义为一个整数。然后通过instance()内部函数判断,如果a不是string类型,就会通过raise语句主动抛出异常,错误内容也是我们自定义的。它的作用是直接告诉用户数据有误。有朋友会问一个问题,你定义了a=1,明明是整数,你还用它来判断是不是字符串,这不是多此一举吗?你不知道它是否是一个字符串?没有错,你之所以有这个问题是因为我们的例子太简单了,假设变量a的内容来自于另一个模块?还是来自于爬虫从网上抓取的数据?我们不知道此时a可能是什么内容,那么就必须使用异常处理机制。raise的语法很简单:raise[exceptionName[(reason)]]后面是你要抛出的异常类型,如果需要写错误内容,传入即可:raiseValueError("amustbeacharacterstring")另外,raise语句还可以和tryexcept结合使用:上面的例子展示了程序是如何主动抛出异常,然后通过except捕获并打印错误信息的。自定义异常其实我们刚刚了解到,所有的异常错误类型其实都是一个类(class),那么我们也可以自定义一个异常类在程序中使用。通过上面的代码示例:我们自定义了一个异常类CustomerError,它继承自Python异常错误类型的基类BaseException,然后定义了它的__init__方法,并使用一个变量来接受传入的错误信息。在__init__方法中你什么也不能做,只是用一个pass占位,因为CustomerError类继承自BaseException,它天生具有BaseException的所有特性。最后我们抛出一个CustomerError异常,并传入一个字符串内容“自定义异常”,异常被except捕获并输出异常内容。总结通过自定义异常,我们可以定义更多我们想要的错误类型,而不必拘泥于Python自带的异常错误类型,精确控制错误发生的时机和处理方式。最后用一张思维导图展示异常处理的相关知识点。