区分Exception和SyntaxError在编写Python程序时,经常会报错。通常有两种类型的错误:SyntaxError:一些语法错误是异常。称为解析错误,它是[1]中最常遇到的错误:whileTrueprint('Hello!')File"",line1whileTrueprint('Hello!')^SyntaxError:invalidsyntaxSyntaxError当代码不符合Python语法时会抛出SyntaxError。异常Python使用异常对象来表示异常情况。遇到错误时,将抛出异常。如果异常没有被处理或捕获,程序将使用回溯来终止程序的执行。如果是在多线程程序中,就会终止当前线程的执行。在[2]中:1/0----------------------------------------------------------------------ZeroDivisionErrorTraceback(最近调用最后)in()---->11/0ZeroDivisionError:当被零除除以0时,会抛出ZeroDivisionError异常(ZeroDivisionError类的一个实例)。ExceptionHierarchyPython3.5.2内置异常的类层次如下:参考标准库BaseException#所有异常的基类+--SystemExit#程序退出/终止+--KeyboardInterrupt#通过键盘中断(通常是Ctrl+C)生成+--GeneratorExit#通过generator.close()方法抛出+--Exception#所有非退出异常的基类+--StopIteration#停止迭代错误+--StopAsyncIteration#停止异步迭代错误+--ArithmeticError#算术异常的基类|+--FloatingPointError#浮点运算异常|+--OverflowError#溢出引起的异常|+--ZeroDivisionError#由对0的除法或模运算引起的异常+--AssertionError#由assert语句引发+--AttributeError#当属性名称无效时引发+--BufferError#引发缓冲区错误+--EOFError#引发当到达文件末尾时+--ImportError#导入语句失败+--LookupError#索引和键错误|+--IndexError#超出序列索引范围|+--KeyError#键不存在+--MemoryError#内存不足+--NameError#找不到本地或全局名称|+--UnboundLocalError#没有绑定局部变量+--OSError#操作系统错误|+--BlockingIOError#IO阻塞|+--ChildProcessError#子进程|+--钴nnectionError#连接错误||+--BrokenPipeError#管道损坏||+--ConnectionAbortedError#连接中止||+--ConnectionRefusedError#连接被拒绝||+--ConnectionResetError#连接重置|+--FileExistsError#文件存在存在|+--FileNotFoundError#文件不存在|+--InterruptedError#中断错误|+--IsADirectoryError#目录错误|+--NotADirectoryError#非目录错误|+--PermissionError#权限错误|+--ProcessLookupError#进程查找错误|+--TimeoutError#超时错误+--ReferenceError#销毁引用对象后仍然使用引用+--RuntimeError#运行时错误|+--NotImplementedError#功能未实现|+--RecursionError#递归错误+--SyntaxError#语法错误|+--IndentationError#缩进错误|+--TabError#使用不一致的制表符+--SystemError#解释器中的非致命系统错误+--TypeError#传递给操作类型的错误+--ValueError#无效类型|+--UnicodeError#Unicode错误|+--UnicodeDecodeError#Unicode解码错误|+--UnicodeEncodeError#Unicode编码错误|+--UnicodeTranslateError#Unicode翻译错误+--Warning#警告的基类+--DeprecationWarning#关于已弃用功能的警告+--PendingDeprecationWarning#关于将被弃用的功能的警告+--RuntimeWarning#关于可疑运行时行为的警告+--SyntaxWarning#Warningaboutsusgioussyntax+--UserWarning#Warningaboutusercodegeneration+--FutureWarning#Aboutconstructingfuturesemanticswithchanges+--ImportWarning#Importstatementwarnings+--UnicodeWarning#Unicodewarnings+--BytesWarning#Byteswarnings+--ResourceWarning#资源警告所有异常的基类都是BaseException,除了SystemExit、KeyboardInterrupt、GeneratorExit,所有异常都继承自Exception来捕获异常。捕获异常可以使用try/except语句来检测try语句块中的错误,这样except语句就可以捕获并处理异常信息。try/except基本语法try:except:#如果try部分抛出名为'name'的异常,则执行此代码示例In[3]:try:...:x=int(input("Pleaseenteranumber:"))...:exceptValueError:...:print("Novalidnumber.")...:Pleaseenteranumber:asdNovalidnumber.多个exceptIn[4]:importsysIn[5]:try:...:f=open('file.txt')#文件不存在时会抛出FileNotFoundError...:s=f.readline()...:i=int(s.strip())...:exceptOSError:#FileNotFoundError异常的上层异常...:print('OSerror.')...:exceptValueError:...:print('Couldnotconvertdatatointeger.')...:exceptException:...:print('Exception.')...:except:#当没有添加特定的异常类型时,所有的异常都会被捕获,不应使用或谨慎使用...:print('Unexpectederror:',sys.exc_info()[0])...:OS错误。每个except之间的执行顺序:异常顺序捕获try中抛出的异常比较具体的异常应该放在前面,比较一般的异常应该放在后面可选的else语句语法try:except:#Ifantry部分抛出名为'name'的异常,然后执行这段代码else:#如果没有异常发生,执行这段代码如果try部分没有抛出异常,但必须执行语句,放在else语句中codeforarginsys.argv[1:]:try:f=open(arg,'r')exceptIOError:print('cannotopen',arg)else:#在没有异常抛出(即文件打开正确)的情况下打印出文件中的每一行print(arg,'has',len(f.readlines()),'lines')f.close()finally语句finally语句用于定义在任何情况下都必须执行的语句。在[1]:try:...:raiseKeyboardInterrupt...:finally:...:print('Goodbye')...:Goodbye----------------------------------------------------------------------KeyboardInterruptTraceback(最近一次调用)in()1try:---->2raiseKeyboardInterrupt3finally:4print('再见')5KeyboardInterrupt:finally执行顺序与return语句defp(x):print(x)returnxdeft():try:returnp(2)print('haha')finally:returnp(3)x=t()#输出结果为:23#返回值x为3。在try块中,只要有finally语句,即使函数提前返回,finally语句也会在退出try块之前执行,所以返回值会被替换中的return语句。综合使用示例In[1]:defdivide(x,y):...:try:...:result=x/y...:exceptZeroDivisionError:...:print('divisionbyzero!')...:else:...:print('resultis',result)...:finally:...:print('executingfinallyclause.')...:In[2]:divide(2,0)除以零!执行finally子句。在[3]中:divide(2,1)结果是2.0执行finally子句。在[4]中:divide('2','1')执行finally子句。---------------------------------------------------------------------TypeErrorTraceback(最近调用最后)in()---->1divide('2','1')individe(x,y)1defdivide(x,y):2try:---->3result=x/y4除了ZeroDivisionError:5print('除以零!')TypeError:不支持的操作数类型/:'str'和'str'结论:无论如何,即使try部分有return语句,finally语句也会被执行,finally语句会在退出try块之前执行,返回值为finally中的return.如果有异常没有被处理,那么在finally语句执行完之后,就会抛出一个未处理的异常。在实际使用中,finally通常用于释放额外的资源,例如主动抛出异常的文件或网络连接。[1]中的raise语句:raiseNameError('Hello')------------------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)in()---->1raiseNameError('Hello')NameError:Hellouser-definedexception用户定义的异常类应该直接或间接继承自Exception类。类CustomException(Exception):def__init__(self,code,message):self.code=codeself.message=messagetry:raiseCustomException(500,'error')exceptCustomExceptionase:print('{},{}'.format(e.code,e.message))#Outputresult:500,errorexception的传递函数中抛出异常时,如果没有捕获异常,则传播到函数所在的地方叫。在[1]中:defa():...:raiseException('Hello')...:在[2]中:defb():...:print('enterb')...:a()#函数a抛出的异常会传递给父函数的调用者...:print('exitb')#a抛出异常后传递给b,并执行b的将终止...:在[3]:b()中输入b------------------------------------------------------------------------异常回溯(最近调用last)in()---->1b()inb()1defb():2print('enterb')---->3a()4print('exitb')5ina()1defa():---->2raiseException('你好')异常:你好记得帮我搞定!对计算机各个方向的视频课程和电子书,从入门、进阶、实用进行了认真梳理,并按照目录进行合理分类。你总能找到你需要的学习资料。你在等什么?立即关注并下载!!!念念不忘,必有回响,朋友们,请点个赞,万分感谢。我是职场亮哥,四年工作经验的YY高级软件工程师,拒绝当领导的斜杠程序员。听我说,我进步很大。如果有幸帮到你,请给我一个【点赞】,给我一个关注,如能评论鼓励,将不胜感激。职场凉阁文章列表:更多文章我的所有文章和回答均与版权保护平台合作,版权归职场凉阁所有。未经授权转载必究!