PHP前端开发

python中异常有哪些?

百变鹏仔 3周前 (02-06) #Python
文章标签 异常

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

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

1、语法错误

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

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

立即学习“Python免费学习笔记(深入)”;

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

2、异常

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

&gt;&gt;&gt; int("aa")Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: invalid literal for int() with base 10: 'aa'&gt;&gt;&gt; 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'</module></stdin></module></stdin>

立即学习“Python免费学习笔记(深入)”;

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

2)python的标准异常类

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

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

3、异常处理

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

1)try-except:语句

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

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

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

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

立即学习“Python免费学习笔记(深入)”;

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

try:    i = 1 / 0    nu = int("aa")except (ValueError, ZeroDivisionError) as e:    print(e)except:    passprint("----------")# 输出结果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("出现异常--&gt;", e)else:    print("没有出现异常--&gt;执行else")finally:    print("不管是否出现异常,这里的语句一定会被执行")# 输出结果出现异常--&gt; division by zero不管是否出现异常,这里的语句一定会被执行

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

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

立即学习“Python免费学习笔记(深入)”;

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

5、抛出异常 raise

1)抛出python已定义的异常

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

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

2)抛出自定义异常

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

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

立即学习“Python免费学习笔记(深入)”;

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

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

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

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

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