当前位置: 首页 > 后端技术 > Python

图形蟒蛇-错误和异常处理

时间:2023-03-25 23:41:54 Python

作者:韩信子@ShowMeAI教程地址:http://www.showmeai.tech/tuto...本文地址:http://www.showmeai.tech/article-detail/87免责声明:版权所有,转载请联系平台和作者并注明出处1.Python3错误和异常我们在实际编程过程中经常会看到一些错误信息,而python中有专门的方法来处理错误和异常。确保顺利的全球进程。Python中的语法错误和异常很容易识别,我们也可以使用try...except来进行相应的处理。2.语法错误初学者经常会遇到Python语法错误或者解析错误,如下面真实代码示例>>>whileTrueprint('HelloShowMeAI')File"",line1,in?whileTrueprint('HelloShowMeAI')^SyntaxError:invalidsyntax在这个例子中,函数print()被检查是否有错误,并且在它之前缺少一个冒号:。解析器指出错误的行,并在发现的第一个错误的位置标记一个小箭头。3.异常即使Python程序语法正确,运行起来也有可能出错。在运行时检测到的错误称为异常。大多数异常不会被程序处理,并以错误信息的形式显示在这里(以下代码可以在在线python3环境下运行):foriinrange(5,-5,-1):print(5/i)结果如下:1.01.251.66666666666666672.55.0Traceback(mostrecentcalllast):File"",line4,inZeroDivisionError:divisionbyzeroexceptionsappearindifferenttypes,andthese类型用作信息部分打印:示例中的类型为ZeroDivisionError、NameError和TypeError。错误信息的前面部分展示了异常发生的上下文,具体信息以调用栈的形式展示。4.异常处理(1)try-except异常捕获可以使用try/except语句。在下面的示例中,让用户输入一个有效的整数,但允许用户中断程序(使用Control-C或操作系统提供的方法)。用户中断的消息引发KeyboardInterrupt异常。whileTrue:try:x=int(input("Pleaseenteranumber:"))breakexceptValueError:print("Youhaveenteredsomethingotherthananumber,pleasetryagain!")try语句的工作原理如下;首先,执行try子句(关键字try和关键字except之间的语句)。如果没有异常发生,则except子句被忽略,try子句执行完毕后结束。如果在执行try子句期间发生异常,则try子句的其余部分将被忽略。如果异常类型匹配except后面的名字,那么相应的except子句就会被执行。如果一个异常没有匹配到任何一个except,那么这个异常就会被传递给上层try。一个try语句可能包含多个except子句来处理不同的特定异常,其中只会执行一个分支。处理程序只会处理相应try子句中的异常,不会处理其他try的处理程序中的异常。一个except子句可以同时处理多个异常,这些异常会被放在括号中组成一个元组,例如:except(RuntimeError,TypeError,NameError):pass最后一个except子句可以忽略异常的名字,它将用作通配符。您可以使用此方法打印错误消息,然后再次抛出异常。导入系统:f=open('ShowMeAI.txt')s=f.readline()i=int(s.strip())exceptOSErroraserr:print("SystemError:{0}".format(err))exceptValueError:print("Cannotbeconvertedtointeger")except:print("Unknownerror:",sys.exc_info()[0])raise(2)try-except-elsetry/except语句有一个可选的else如果使用子句,则必须放在所有except子句之后。如果try子句中没有发生异常,else子句就会执行。下面的例子在try语句中判断文件是否可以打开。如果打开文件没有异常,则执行else部分的语句读取文件内容:forarginsys.argv[1:]:try:f=open(arg,'r')exceptIOError:print('Cannotopenfile',arg)else:print(arg,'has',len(f.readlines()),'lines')f.close()使用elsesub最好把所有的语句都放在try子句而不是将它们放在try子句中,以免出现一些except无法捕获的意外异常。异常处理不仅处理try子句中直接发生的异常,还处理子句中调用的函数(甚至是间接调用的函数)抛出的异常。例如:>>>defthis_fails():x=1/0>>>try:this_fails()exceptZeroDivisionErroraserr:print('Anerroroccurred:',err)#Anerroroccurred:intdivisionormodulobyzero(3)try-finally语句try-finally语句无论是否发生异常都会执行最后的代码。在下面的例子中,无论是否发生异常都会执行finally语句:file.read()exceptFileNotFoundErrorasfnf_error:print(fnf_error)finally:print('无论是否发生异常,都会执行这句话。')5.抛出异常Python使用raise语句抛出指定的异常。raise的语法格式如下:raise[Exception[,args[,traceback]]]以下示例代码如果x大于10则触发异常:x=20ifx>10:raiseException('xcannotbegreaterthan10.thevalueofxis:{}'.format(x))执行上面的代码会触发异常:Traceback(mostrecentcalllast):File"test.py",line3,inraiseException('xcannotbegreaterthan5.Thevalueofxis:{}'.format(x))Exception:xcannotbegreaterthan10.Thevalueis:20raise唯一参数指定要抛出的异常.它必须是异常或异常类(即Exception的子类)的实例。如果你只是想知道这是否引发了异常,并且不想处理它,那么一个简单的raise语句可以再次引发它。>>>try:raiseNameError('NewError')exceptNameError:print('Anexception!')raiseAnexception!Traceback(最近一次调用last):文件“”,第2行,在?NameError:NewError6.用户定义的异常您可以通过创建一个新的异常类来拥有自己的异常。异常类继承自Exception类,可以直接继承也可以间接继承,例如:>>>classNewError(Exception):def__init__(self,value):self.value=valuedef__str__(self):returnrepr(self.value)>>>try:raiseNewError(2*2)exceptNewErrorase:print('Newexceptionoccurred,value:',e.value)我的异常发生了,value:4>>>raiseNewError('oops!')Traceback(最近一次调用最后一次):文件“”,第1行,在?__main__.NewError:'oops!'在此示例中,类Exception的默认__init__()被覆盖。在创建一个可能抛出很多不同异常的模块时,通常的做法是为包创建一个异常基类,然后基于这个基类为不同的错误情况创建不同的子类:classError(Exception):"""Base此模块中异常的类。"""passclassInputError(Error):"""Exceptionraisedforerrorsintheinput.Attributes:expression--发生错误的输入表达式message--错误的解释"""def__init__(self,expression,message):自我。表达=表达自我。message=messageclassTransitionError(Error):"""当操作尝试进行不允许的状态转换时引发。属性:previous--转换开始时的状态next--尝试的新状态message--解释为什么特定转换不被允许allowed"""def__init__(self,previous,next,message):self.以前的=以前的自己。下一个=下一个self.message=message大多数异常名称都以“Error”结尾,就像标准异常名称一样7.定义清理行为try语句还有另一个可选子句,它定义是否将执行清理操作。例如:>>>try:...raiseKeyboardInterrupt...finally:...print('Goodbye,ShowMeAI!')...Goodbye,ShowMeAI!Traceback(mostrecentcalllast):File"",line2,inKeyboardInterrupt在上面的例子中,无论try子句是否有异常,finally子句都会被执行。如果在try子句中(或在except和else子句中)抛出异常,并且没有except来捕获它,则异常将在finally子句执行后抛出。这是一个更复杂的例子(在同一个try语句中有except和finally子句):>>>defdivide(x,y):try:result=x/yexceptZeroDivisionError:print("Dividedby0!")else:print("结果为",result)finally:print("除法计算结束")>>>divide(2,1)结果为2.0除法计算结束>>>divide(2,0)的除数为0!除法计算结束>>>divide("2","1")除法计算结束回溯(最后一次调用):文件“”,第1行,在?文件“”,第3行,在divideTypeError中:/:'str'和'str'不支持的操作数类型8.预定义清理行为有些对象定义了标准清理行为,无论系统是否成功使用它,一旦不需要,就会执行标准的清理行为。此处的示例显示尝试打开一个文件,然后将内容打印到屏幕上:forlineinopen("ShowMeAI.txt"):print(line,end="")上面代码的问题在于执行完成后,文件保持打开状态,不会关闭。关键字with语句可以保证文件等对象在使用后会正确执行他的清理方法:withopen("ShowMeAI.txt")asf:forlineinf:print(line,end="")在上面的代码之后被执行后,即使在处理过程中出现问题,文件f也会一直关闭。9、视频教程也可以点此查看B站带【中英文字幕】的版本https://www.bilibili.com/video...资料及代码下载本教程系列代码可在ShowMeAI下载对应的github,可以在本地python环境下运行,会科学上网的宝宝们也可以使用googlecolab来运行,一键交互学习!本系列教程涉及的Python备忘单可在以下地址下载:Python备忘单扩展参考资料Python教程-Python3文档Python教程-廖雪峰官网ShowMeAI相关文章推荐python基本数据类型python运算符python条件控制和if语句python循环语句pythonwhile循环pythonfor循环pythonbreak语句pythoncontinue语句pythonpass语句python字符串和操作pythonlistpythontuplepython字典pythonsetpython函数python迭代器和生成器Python数据结构Python模块Python文件读写Python文件和目录操作Python错误和异常处理Python面向对象编程PythonNamespaceandScopePythonTimeandDateShowMeAI系列教程推荐图Python编程:从入门到精通系列教程图解数据分析:从入门到精通系列教程ls图解AI数学基础:从入门到大师系列教程图解大数据技术:从入门到大师系列教程