中对于「捕获异常」是有区别的,虽然我一直用的是 Python3,但是还是依然有一部分读者用的是 Python2,所以我准备再用这一篇文章来写一下不同版本的 Python 对于捕获异常的差异,顺便再补充一下捕获多个不同的异常应该如何去做...捕获异常 下面我主要用一个例子的方式来演示 Python2 和 Python3 对于捕获异常的差异所在: my_list = [1,2,3,4] try: # 抛出异常 IndexError...这个是因为我们我们想要同时获取多个不同类型的异常时,我们需要将它们用括号把它们包成一个元组作为第一个参数传递,这个是必须的,第二个参数的话就是「可选名称」,如果你写的话它就会和被捕获的异常实例绑定,不写也没什么问题...,具体请看下例: my_list = [1,2,3,4] try: # 抛出异常 IndexError print(my_list[10]) except (IndexError, ValueError...其实这是因为在 Python3 中用逗号区分异常与可选名称是无效的; 正确的做法是使用 as 关键字,具体如下所示: my_list = [1,2,3,4] try: # 抛出异常 IndexError
捕捉异常可以使用try/except语句。 try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。...如果你不想在异常发生时结束你的程序,只需在try里捕获它。...#可能出现异常的代码 except IndexError as e: # 捕捉索引异常的子异常,注意,这里的as e在老版本的py中可以写成,e但是新版本中用as e,",e"未来可能会淘汰...print("IndexError:",e) except ValueError as e: # 捕捉value错误的子异常 print("ValueError:",e) except...Exception as e: # 如果上面两个异常没有捕获到,那么使用Exception捕获,Exception能够捕获所有的异常 print("Exception:",e) else
UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning..., err: # , 加原因参数名称 print ('Exception: ', err) Python3 try: print (1/0) except...# 未捕获到异常,程序直接报错 s1 = 'hello' try: int(s1) except IndexError as e: print e ?...s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e)...最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
异常处理 try...except...: 1.在try语句中捕获异常,在except语句中处理异常。...当try所包含的语句中没有异常时,程序正常执行,except语句被忽略,不再执行;当try语句中捕获到了异常时,try语句从异常出现的位置都不再执行,而是执行except语句进行异常处理。 ...3.try后还可以有多个except语句,每个except语句都可以用来处理某一类的异常,当try捕获到了某个异常时,就会跳到相应的except语句中进行异常的处理。...5.如果except语句中对异常处理的要求不严格,不需要具体的处理某一类的异常,可以直接使用except或者except Exception, e或者except Exception as e来捕获所有类型的异常...当只使用raise关键字时,而没有自定义异常,它会将当前位置发生的异常向上抛出,抛到上一级位置。
这时候,就需要捕获处理它,否则程序会终止执行。 异常处理 使用try/except/finally语句进行捕获操作,并告诉Python发生异常时如何处理。...首先,检测try语句块中的错误,except语句捕获异常信息并处理。如果在try子句执行时没有发生异常,Python将执行else语句后的语句,然后控制流通过整个try语句。...如何捕获多个异常? 1.写出多行except 异常/错误,指定捕获多个不同类型的异常。2.使用 except (异常1,异常2..),使用元组,在一行中捕获多个不同类型的异常。...异常捕获示例代码: try: print(10/0) except NameError: print('出现 NameError 异常') except ZeroDivisionError...: print('出现 ZeroDivisionError 异常') except IndexError: print('出现 IndexError 异常') except Exception
UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning...try expect 这个语句 一般使用情景是: try: 判断语句或者执行语句 except 报错名称: 报错之后的处理语句(你也可以简单打印) else:...: list index out of range 此时报错是IndexError 接下来,我们来捕获他 In [3]: for i in range(0,5): ...: try:......: print(a[i]) ...: except IndexError: ...: print('find index error')...(0,5): ...: try: ...: print(a[i]) ...: except IndexError: ...: print
Python 也允许程序自行引发异常,自行引发异常使用 raise 语句来完成。 使用 raise 抛出新的异常 使用 raise ... from ......抛出新的异常时,新的异常是由旧的异常表现的; 使用 raise ... from None 抛出新的异常时,不会打印旧的异常(即禁止的异常关联) raise 引发异常 使用 raise 语句,主动引发异常...程序就会终止 try… except 捕获异常 使用try… except 捕获异常 x = [20, 3, 22, 11] try: print(x[7]) except IndexError...7]) except IndexError: print("index out of list") raise NameError("new exception ...")...occurred,即在处理 IndexError 异常时又出现了 NameError 异常,两个异常之间没有因果关系。
int(l[2]) ... except ValueError, IndexError: # To catch both exceptions, right... pass ......因此,在上述代码中,except语句并没有捕捉到IndexError异常;而是将出现的异常绑定到了参数IndexError中。...int(l[2]) ... except (ValueError, IndexError) as e: ......回到上面的示例中,当导入a.py模块时,程序可以正常导入b.py模块,因为此时b.py模块未访问a.py中定义任何的变量或函数。b.py模块仅引用了a.py模中的a.f()函数。...但是,如果我们在未导入a.py模块之前先导入b.py模块,结果会怎样?
: string index out of range 可以使用try/except来捕获异常。...raise IndexError raise IndexError() 可以为异常类构建实例时指定点参数信息,这些参数会保存到名为args的元组。...所以能通过空的except:捕获到它,却不能通过except Exception:来捕获。...但是在最外面,使用try包围action1()的调用,看上去异常也会被捕获,但实际上并不会,因为在action2()中就已经通过except处理好了异常,而处理过的异常将不再是异常,不会再触发外层的异常...本来是想在外层的try中明确捕获func触发的IndexError异常的,但是func()内却使用了空的except:,使得异常直接在这里被处理,外层的try永远也捕获不到任何该函数的异常。
UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning...as e: # 未捕获到异常,程序直接报错 print e 多分支 s1 = 'hello' try: int(s1) except IndexError as e: print...多分支后来一个Exception s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as...语句无论是否发生异常都将执行最后的代码 s1 = 'hello' try: int(s1) except IndexError as a: print(e) except KeyError...,才应该加上try…except 记录错误 如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也就结束了,既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时让程序继续执行下去
异常类 当 Python解释器接收到异常对象时,如何为该异常对象寻找 except块呢?注意到前面的代码中的except块,这个块是专门用于处理该异常类及其子类的异常实例。...当程序发生不同的意外情况时,系统会生成不同的异常对象, Python解释器就会根据该异常对象所属的异常类来决定使用哪个 except块来处理该异常。...多异常捕获 Python的一个 except块可以捕获多种类型的异常。在使用一个 except块捕获多种类型的异常时,只要将多个异常类用圆括号括起来,中间用逗号隔开即可。...): print("程序发生了数组越界、数字格式异常、算术异常之一") except: print("未知异常") 在这段程序中使用了 (IndexError, ValueError,...ArithmeticError)来指定所捕获的异常类型,这就表明该 except块可以同时捕获这3种类型的异常。
IndexError:当索引超出列表、元组或其他序列类型的范围时,将引发此异常。KeyError:当在字典中找不到键时,会引发此异常。...代码使用 try 和 except' 块来捕获此异常并打印错误消息。...语句:捕获异常try 和 except 语句用于捕获和处理 Python 中的异常。...仅当 try 子句未引发异常时,代码才会进入 else 块。...此代码有意使用try块中的raise语句引发消息NameError“Hi there”。然后,它捕获异常,打印“异常”,并使用raise重新引发相同的NameError异常。
捕获异常 可以对try-except代码中的异常进行捕获,再不确定是那种异常的情况下可以使用异常的基类Exception进行捕获 def divid(x, y): res = 0 try...res 程序运行还是出错,这是因为异常类型不匹配,所以没有捕获到,在进行异常处理时如果可以确定具体的异常类型就使用具体的异常类型,如果不确定就是用基类异常,使用的异常不匹配程序仍然不能正确执行 捕获多个异常...可以通过连续添加except代码块的方式捕获多个异常。...as e3: # 代码块 当 except 代码块有多个的时候,当异常类型匹配后,就不会继续往下捕获,也可以使用元组将所有待捕获的异常存起来。...] except IndexError as e: print(e) ValueError ValueError 常出现在数据类型转换时 name = 'stark' print(int(name
int(l[2])... except ValueError, IndexError: # To catch both exceptions, right?......因此,在上述代码中,except语句并没有捕获IndexError异常;而是将出现的异常绑定到了一个名为IndexError的参数中。...要想在except语句中正确地捕获多个异常,则应将第一个参数指定为元组,然后在元组中写下希望捕获的异常类型。...int(l[2])... except (ValueError, IndexError) as e: ......在使用列表时,Python程序员尤其容易陷入这个圈套。 请看下面这个代码示例: >>> lst = [1, 2, 3]>>> def foo1():...
在错误发生之前进行预防 之前也是有操作过的: AGE=10 while True: age=input(' : ').strip() if age.isdigit(): #只有在age为字符串形式的整数时,...s1 = 'hello' try: int(s1) except IndexError as e: # 未捕获到异常,程序直接报错 print e #2 多分支 s1 = 'hello' try...: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as...#5 也可以在多分支后来一个Exception s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError...= 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except
在错误发生之前进行预防 AGE = 10 while True: age = input('>>: ').strip() if age.isdigit(): # 只有在age为字符串形式的整数时,...s1 = 'hello' try: int(s1) except IndexError as e: # 未捕获到异常,程序直接报错 print(e) 2.多分支 s1 = 'hello...' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError...5.也可以在多分支后来一个Exception s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError...s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e
使用if判断式可以异常处理,但是if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。...python特定的语法结构捕获异常 #异常捕获 单个分支 try: 逻辑代码(被捕获得内容) except 异常类型: 检测到异常,就执行这个位置的逻辑 # 多个分支捕获 #...单分支只能用来处理指定的异常情况,如果未捕获到异常,则报错 try: abc() except ValueError: print('异常输出') except IndexError:...print('异常输出') # Exception 属性可以捕获任意异常,不过它是一把双刃剑,有利有弊,我们要视情况使用 try: abc() except Exception as..., 结果为raise一个AssertionError出来 用sys模块回溯最后的异常 当发生异常时Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这是可以使用sys模块回溯最近一次异常
else: 没有异常时执行 finally: 无论异常与否,都会执行该模块,通常是进行清理工作 try: 代码块1 代码块...print('========>4') except IndexError as ie: print('IndexError',ie) except KeyError as ke:...) except IndexError as ie: print('IndexError',ie) except KeyError as ke: print('KeyError',ke...) except Exception as e: print('Error',e) print('other code') # 5.else和finally的使用和区别 try: print...print('========>4') except IndexError as ie: print('IndexError',ie) except KeyError as ke:
IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError...映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命的) NameError 未声明/初始化对象 (没有属性) UnboundLocalError 访问未初始化的本地变量...UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning...,处理异常 只有将对应的异常类型捕获才能进行异常的处理 异常的捕获处理方式: try: #程序执行的代码,异常检测的代码 pass except Exception as e:...pass 这里的except就像是java里的catch 也可以在代码中添加多个except语句来捕获不同种类型的异常,执行相应不同的操作 3.主动抛出异常 异常的抛出可以手动添加 try:
什么是异常 python异常捕获,在刚开始学的时候,经常会遇到两种报错信息:语法错误和执行的异常。...KeyError 映射中没有这个键 MemoryError 内存溢出错误(对于Python 解释器不是致命的) NameError 未声明/初始化对象 (没有属性) UnboundLocalError 访问未初始化的本地变量...UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning...try/except 异常捕捉可以使用 try/except 语句。...try/except...else 如果使用这个子句,那么必须放在所有的 except 子句之后。 else 子句将在 try 代码块没有发生任何异常的时候被执行。
领取专属 10元无门槛券
手把手带您无忧上云