Python 异常处理机制会涉及 try、except、else、finally 这 4 个关键字和 raise 语句 。
Python 编写程序时遇到的异常可大致分为 2 类:语法错误和运行时异常。
运行时异常:即程序在语法上都是正确的,但在运行时发生了错误。把在运行期检测到的错误被称为异常(Exceptions)。
常见的运行时异常如下:
- NameError:尝试访问一个未声明的变量时,引发此异常
- IndexError :索引超出序列范围会引发此异常
- KeyError:字典中查找一个不存在的关键字时引发此异常
- TypeError:不同类型数据之间的无效操作
- ZeroDivisionError:除法运算中除数为 0 引发此异常
- AttributeError:当试图访问的对象属性不存在时抛出的异常
异常处理
try/except
使用 try except语句捕获并处理异常,其基本语法格式如下:
try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块2 except [Exception]: 处理其它异常
- 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。
- 一个except子句可以同时处理一个或者多个异常,这些异常将被放在一个括号里成为一个元组。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。Python 解释器会寻找能处理该异常对象的 except 块,如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
try/except…else
try/except 语句还有一个可选的 else 子句,在except 子句之后添加一个 else 子句,即try except else结构。
其基本语法格式如下:
try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块2 except [Exception]: 处理其它异常 else: try没有发生任何异常的时,才会执行的语句
else 子句含义:
只有在 try 子句没有发生任何异常的时候执行 else 块中的代码。否则不执行它。else 子句必须放在所有的 except 子句之后。try: a = int(input("输入被除数:")) b = int(input("输入除数:")) c = a / b print("您输入的两个数相除的结果是:", c) except (ValueError, ArithmeticError): print("程序发生了数字格式异常、算术异常之一") except ZeroDivisionError: print("除数不能为0") except Exception as e: # 访问异常的错误编号和详细信息 print(e.args) print(str(e)) print(repr(e)) else: print('没有出现任何异常') print("程序继续向下运行")
try-finally
try-finally 语句基本语法格式如下:
try: 可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]: 处理异常的代码块1 except [ (Error3, Error4, ... ) [as e] ]: 处理异常的代码块2 except [Exception]: 处理其它异常 else: try没有发生任何异常的时,才会执行的语句 finally: 无论 try 块是否发生异常都会执行的语句
在整个异常处理机制中,finally 语句的功能是:无论 try 块是否发生异常,最终都要进入 finally 语句,并执行其中的代码块。
注意:
和 else 语句不同,finally 只要求和 try 搭配使用,而至于该结构中是否包含 except 以及 else,对于 finally 不是必须的(else 必须和 try except 搭配使用)。try: a = int(input("请输入 a 的值:")) print(20/a) except: print("发生异常!") else: print("执行 else 块中的代码") finally : print("执行 finally 块中的代码")
抛出异常
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:
raise [exceptionName [(reason)]]
也就是说,raise 语句有如下三种常用的用法:
- raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
- raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
- raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
try: a = input("输入被除数:") # 判断用户输入的是否为数字 if (not a.isdigit()): # raise # raise ValueError() raise ValueError("a 必须是数字") b = int(input("输入除数:")) c = a / b print("您输入的两个数相除的结果是:", c) except ValueError as e: print("引发异常:", repr(e)) except [RuntimeError, TypeError]: raise except Exception as e: # 访问异常的错误编号和详细信息 print(e.args) print(str(e)) print(repr(e)) except: print("未知异常")
自定义异常
- 你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
下面是一个引发异常的例子:
class ShortInputException(Exception): '''自定义的异常类''' def __init__(self, length, atleast): #super().__init__() self.length = length self.atleast = atleast def main(): try: s = input('请输入 --> ') if len(s) < 3: # raise引发一个你定义的异常 raise ShortInputException(len(s), 3) except ShortInputException as result:#x这个变量被绑定到了错误的实例 print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (result.length, result.atleast)) else: print('没有异常发生.') main()
情况1
请输入 --> hello 没有异常发生.
情况2
请输入 --> la ShortInputException: 输入的长度是 2,长度至少应是 3