本篇文章给大家带来的内容是关于python中异常有哪些?python中异常的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

python的异常分为两种,1)、语法错误,在python解释器的语法检测中不通过不能运行代码 2)、异常,python程序运行期检测到的错误被称为异常。在没有做异常处理时,将终止程序并提示异常信息,如:①字符串转换为数字时的类型转换异常,②文件读取时的文件不存在异常,③网络链接时主机不可达异常···等。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。毕竟谁也不希望用着的程序突然的就崩了

1、语法错误

python的语法错误是很多初学者经常遇到的一个问题,这类错误比较低级,只要多敲几遍代码就可以减少这样的错误

>>> if Trur   File "<stdin>", line 1     if Trur           ^ SyntaxError: invalid syntax >>> print("as"))   File "<stdin>", line 1     print("as"))                ^ SyntaxError: invalid syntax

如:出现这样的错误就是语法错误,第1行结尾if语句缺少 ":",第6行结尾多了 ")"

2、异常

1)运行期检测到的错误被称为异常,python的语法检测无法检查这样的错误。

>>> int("aa") Traceback (most recent call last):   File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'aa' >>> f = open("aaa.txt","r") Traceback (most recent call last):   File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: 'aaa.txt'

其中第1行,第5行都是出现异常的地方,看一下异常的输出信息,如下图

python中异常有哪些?python中异常的详细介绍

2)python的标准异常类

BaseException 为所有异常的基类,Exception 为常规错误的基类

其它python的异常类,就不再一一的述说,可以百度查看

3、异常处理

为了提高程序的健壮性,不让程序出现异常时出现崩溃的情况,在必要时需要进行异常处理

1)try-except:语句

①、最简单的异常处理语句如下,当try的语句块中有异常出现时,下边的的语句将不再执行(第3行),异常被except捕获,执行except中的语句块后继续向下执行程序(如第6行)。注:except后边不跟异常的类型,默认捕捉所有的异常

try:     int("aaa")     print("---aaa---") except:     print("出现异常-->英文字母不能转换为数字") print("----------") # 输出结果 出现异常-->英文字母不能转换为数字 ----------

②、多分支异常,当我们需要捕获不同的异常时可以用多个except来实现,需要获取异常的信息可通过as 变量名得到异常的对象,如第7行

try:     nu = int("100")     print("转换后的值nu:", nu)     i = 1 / 0 except ValueError:     print("出现异常-->英文字母不能转换为数字") except ZeroDivisionError as e:  # 通过 as 变量名 获取异常的对象     print("出现异常-->除数不能为零")     print("异常的提示信息-->", e) except:     pass print("----------")   # 输出结果 转换后的值nu: 100 出现异常-->除数不能为零 异常的提示信息--> division by zero ----------

③、当我们需要将多个异常按相同的处理方式可以使用 except (ValueError, [ZeropisionError [, NameError]]):

try:     i = 1 / 0     nu = int("aa") except (ValueError, ZeroDivisionError) as e:     print(e) except:     pass print("----------")   # 输出结果 division by zero ----------

2)try-except-else-finally 语句

①、当try-except-else-finally中出现了finally语句,不管是否出现异常finally语句块中的语句一定会执行,而else中的语句只有不出现异常是才会执行

出现异常时try-except-else-finally如下

try:     i = 1 / 0     print("没有出现异常i值", i) except Exception as e:     print("出现异常-->", e) else:     print("没有出现异常-->执行else") finally:     print("不管是否出现异常,这里的语句一定会被执行")   # 输出结果 出现异常--> division by zero 不管是否出现异常,这里的语句一定会被执行

没有出现异常时try-except-else-finally如下

try:     i = 1 / 1     print("没有出现异常i值", i) except Exception as e:     print("出现异常-->", e) else:     print("没有出现异常-->执行else") finally:     print("不管是否出现异常,这里的语句一定会被执行")   # 输出结果 没有出现异常i值 1.0 没有出现异常-->执行else 不管是否出现异常,这里的语句一定会被执行

②、try-except-else-finally还可以拆开使用,有三种形式 1)try-except-finally 2)try-except-else 3)try-finally。 这里就不展示代码了

4、异常的传递

在发生异常的语句中没有处理异常的语句,异常将向上层传递,直到遇到处理异常的语句,或python解释器终止程序

def test2():     int("aa")  def test1():     test2()  try:     test1() except Exception as e:     print(e) print("-----------")   # 输出结果 invalid literal for int() with base 10: 'aa' -----------

如上test2中第2行出现异常,将向第5行调用test2的语句处传递,这里依旧没有异常处理语句,将继续往上层传递到第8行处被except捕获

5、抛出异常 raise

1)抛出python已定义的异常

通过raise 异常类型即可抛出一个异常,抛出的异常也会被except捕获到。如下边第4行

age = 500 try:     if age < 0 or age > 200:         raise ValueError("age范围0-200")     print("age", age) except ValueError as e:     print("出现异常-->", e) # 输出结果 出现异常--> age范围0-200

2)抛出自定义异常

抛出自定义异常首先得有个自定义的异常类,注:自定义的异常必须直接或间接的继承Exception基类

class MyException(Exception):  # 自定义异常类     def __init__(self, msg):         self.msg = msg   age = 500 try:     if age < 0 or age > 200:         raise MyException("age范围0-200")  # 抛出自定义异常     print("age", age) except MyException as e:     print("出现异常-->", e)   # 输出结果 出现异常--> age范围0-200

当然自定义异常类也可以拥有许多的功能,就得看需求添加啦

6、在异常处理中抛出异常

有某需求:当捕获到异常时处理完后想继续抛出异常…..

在except中用raise可以抛出当前异常

try:     i = 1 / 0  # 异常的语句 except Exception as e:     print("出现异常-->", e)     raise  # 处理完后继续抛出异常,raise表示抛出当前异常 print("-------------")   # 输出结果 出现异常--> division by zero Traceback (most recent call last):   File "<stdin>", line 2, in <module>     i = 1 / 0 ZeroDivisionError: division by zero
标签
DT素材网

DT素材网

147

0

0

( 此人很懒并没有留下什么~~ )