python异常处理try判断整数_三、Pythontryexcept异常处理详
解(⼊门必读)
Python 提供了try except语句捕获并处理异常,该异常处理语句的基本语法结构如下:
try:
可能产⽣异常的代码块
except [(Error1, Error2, ...) [as e]]:
处理异常的代码块1
except [(Error3, Error4, ...) [as e]]:
python的try和except用法处理异常的代码块2
该格式中,[] 括起来的部分可以使⽤,也可以省略;(Error1,Error2,...) 、(Error3,Error4,...) 表⽰各⾃的 except 块可以处理异常的具体类型;[as e] 表⽰将异常类型赋值给变量 e(⽅便在 except 块中调⽤异常类型)。
注意,except 后⾯也可以不指定具体的异常名称,这样的话,表⽰要捕获所有类型的异常。
另外,从 try except 的基本语法格式可以看出,try 块仅有⼀个,但 except 代码块可以有多个,这是为了针对不同的异常类型提供不同的异常处理⽅式。当程序发⽣不同的意外情况时,会对应不同的异常类型,Python 解释器就会根据该异常类型来决定使⽤哪个 except 块来处理该异常。
通过在 try 块后提供多个 except 块可以⽆须在异常处理块中使⽤ if 判断异常类型,但依然可以针对不同的异常类型提供相应的处理逻辑,从⽽提供更细致、更有条理的异常处理逻辑。
try except 语句的执⾏流程如下:
⾸先执⾏ try 中的代码块,如果执⾏过程中出现异常,系统会⾃动⽣成⼀个异常对象,该异常对象会提交给 Python 解释器,此过程被称为引发异常。
当 Python 解释器收到异常对象时,会寻能处理该异常对象的 except 块,如果到合适的 except 块,则把该异常对象交给该 except 块处理,这个过程被称为捕获异常。如果 Python 解释器不到捕获异常的 except 块,则程序运⾏终⽌,Python 解释器也将退出。
事实上,不管程序代码块是否处于 try 块中,甚⾄包括 except 块中的代码,只要执⾏该代码块时出现了异常,系统总会⾃动⽣成⼀个Error 对象。如果程序没有为这段代码定义任何的 except 块,则 Pyth
on 解释器⽆法到处理该异常的 except 块,程序就会停⽌运⾏;反之,如果程序发⽣异常,并且该异常经 try 捕获并由 except 处理完成,则程序会继续执⾏。
举个例⼦:
try:
a = int(input("输⼊被除数:"))
b = int(input("输⼊除数:"))
c = a / b
print("您输⼊的两个数相除的结果是:", c )
except (ValueError, ArithmeticError):
print("程序发⽣了数字格式异常、算术异常之⼀")
except :
print("未知异常")
print("程序继续运⾏")
程序运⾏结果为:
输⼊被除数:a
程序发⽣了数字格式异常、算术异常之⼀
程序继续运⾏
上⾯程序中,第 6 ⾏代码使⽤了(ValueError, ArithmeticError)来指定所捕获的异常类型,这就表明该 except 块可以同时捕获这 2 种类型的异常;第 8 ⾏代码只有 except 关键字,并未指定具体要捕获的异常类型,这种省略异常类的 except 语句也是合法的,它表⽰可捕获所有类型的异常,⼀般会作为异常捕获的最后⼀个 except 块。
除此之外,由于 try 块中引发了异常,并被 except 块成功捕获,因此程序才可以继续执⾏,才有了“程序继续运⾏”的输出结果。
访问异常信息
如果程序需要在 except 块中访问异常对象的相关信息,可以通过为 except 块添加as a来实现。当 Python 解释器决定调⽤某个 except 块来处理该异常对象时,会将异常对象赋值给 except 块后的异常变量,程序即可通过该变量来获得异常对象的相关信息。
所有的异常对象都包含了如下⼏个常⽤属性和⽅法:
args:该属性返回异常的错误编号和描述字符串。
errno:该属性返回异常的错误编号。
strerror:该属性返回异常的描述宇符串。
with_traceback():通过该⽅法可处理异常的传播轨迹信息。
下⾯例⼦演⽰了程序如何访问异常信息:
def foo():
try:
fis = open("a.txt");
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
# 访问异常的错误编号
)
# 访问异常的详细信息
print(e.strerror)
foo()
从上⾯程序可以看出,如果要访问异常对象,只要在单个异常类或异常类元组(多异常捕获)之后使⽤ as 再加上异常变量即可。
在 Python 的早期版本中,直接在单个异常类或异常类元组(多异常捕获)之后添加异常变量,中间⽤逗号隔开即可。
上⾯程序调⽤了 Exception 对象的 args 属性(该属性相当于同时返回 errno 属性和 strerror 属性)访问异常的错误编号和详细信息。运⾏上⾯程序,会看到如下运⾏结果:
(2, 'No such file or directory')
2
No such file or directory
从上⾯的运⾏结果可以看到,由于程序尝试打开的⽂件不存在,因此引发的异常错误编号为 2,异常详细信息为:No such file or directory。
关于如何处理异常的传播轨迹信息,以及使⽤ open() ⽅法来打开⼀个⽂件,⽤于读取磁盘⽂件的内容,后续章节还有更详细的介绍,此处暂不详细讲解。
异常类的继承体系
当 Python 解释器接收到异常对象时,如何为该异常对象寻 except 块呢?注意上⾯程序中 except 块的 except Exception,这意味着此 except 块专门⽤来处理该异常类以及其⼦类的异常实例。
当 Python 解释器接收到异常对象后,会依次判断该异常对象是否是 except 块后的异常类或其⼦类的实例,如果是,Python 解释器将调⽤该 except 块来处理该异常;否则,再次拿该异常对象和下⼀个 except 块⾥的异常类进⾏⽐较。
Python 异常捕获流程⽰意图如图 1 所⽰:
图 1 Python 异常捕获流程⽰意图
从图 1 中可以看出,在通常情况下,如果 try 块被执⾏⼀次,则 try 块后只有⼀个 except 块会被执⾏,不可能有多个 except 块被执⾏。除⾮在循环中使⽤了 continue 开始下⼀次循环,下⼀次循环⼜重新运⾏了 try 块,这才可能导致多个 except 块被执⾏。
Python 的所有异常类都从 BaseException 派⽣⽽来,提供了丰富的异常类,这些异常类之间有严格的继承关系,图 2 显⽰了 Python 的常见异常类之间的继承关系。
图 2 Python 的常见异常类之间的继承关系
从图 2 中可以看出,Python 的所有异常类的基类是 BaseException,但如果⽤户要实现⾃定义异常,则不应该继承这个基类,⽽是应该继承 Exception 类。
BaseException 的主要⼦类就是 Exception,不管是系统的异常类,还是⽤户⾃定义的异常类,都应该从 Exception 派⽣。
下⾯看⼏个简单的异常捕获的例⼦:
try:
a = int(input("输⼊被除数:"))
b = int(input("输⼊除数:"))
c = a / b
print("您输⼊的两个数相除的结果是:", c )
except ValueError:
print("数值错误:程序只能接收整数参数")
except ArithmeticError:
print("算术错误")
except Exception:
print("未知异常")
上⾯程序针对 ValueError、ArithmeticError 类型的异常,提供了专门的异常处理逻辑。该程序运⾏时的异常处理逻辑可能有如下⼏种情形:
如果在运⾏该程序时输⼊的参数不是数字,⽽是字母,将发⽣数值错误,Python 将调⽤ ValueError 对应的 except 块处理该异常。
如果在运⾏该程序时输⼊的第⼆个参数是 0,将发⽣除 0 异常,Python 将调⽤ ArithmeticError 对应的 except 块处理该异常。
如果在程序运⾏时出现其他异常,该异常对象总是 Exception 类或其⼦类的实例,Python 将调⽤ Exception 对应的 except 块处理该异常。
上⾯程序中的异常类型,都是⾮常常见的运⾏时异常,读者应该记住这些异常,并掌握在哪些情况下可能出现这些异常。
正如在前⾯程序中所看到的,程序总是把对应 Exception 类的 except 块放在最后,这是为什么呢?想
⼀下图 1 所⽰的 Python 异常捕获流程,可能你就会明⽩,如果把 Exception 类对应的 except 块排在其他 except 块的前⾯,Python 解释器将直接进⼊该 except 块(因为所有的异常对象都是 Exception 或其⼦类的实例),⽽排在它后⾯的 except 块将永远也不会获得执⾏的机会。
实际上,在进⾏异常捕获时,不仅应该把 Exception 类对应的 except 块放在最后,⽽且所有⽗类异常的 except 块都应该排在⼦类异常的except 块的后⾯( 即:先处理⼩异常,再处理⼤异常)。
虽然 Python 语法没有要求,但在实际编程时⼀定要记住先捕获⼩异常,再捕获⼤异常。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论