zoukankan      html  css  js  c++  java
  • python 异常

    导航:

    1、语法错误
    2、异常
    3、异常处理
    4、异常的传递
    5、抛出异常
    6、在异常处理中抛出异常

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

    1、语法错误

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

     1 >>> if Trur
     2   File "<stdin>", line 1
     3     if Trur
     4           ^
     5 SyntaxError: invalid syntax
     6 >>> print("as"))
     7   File "<stdin>", line 1
     8     print("as"))
     9                ^
    10 SyntaxError: invalid syntax

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

     

    2、异常

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

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

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

    2)python的标准异常类

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

    其它python的异常类可以到这里看(http://www.runoob.com/python/python-exceptions.html),就不再一一的述说,也可以百度查看

    3、异常处理

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

    1)try-except:语句

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

     1 try:
     2     int("aaa")
     3     print("---aaa---")
     4 except:
     5     print("出现异常-->英文字母不能转换为数字")
     6 print("----------")
     7 
     8 
     9 # 输出结果
    10 出现异常-->英文字母不能转换为数字
    11 ----------

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

     1 try:
     2     nu = int("100")
     3     print("转换后的值nu:", nu)
     4     i = 1 / 0
     5 except ValueError:
     6     print("出现异常-->英文字母不能转换为数字")
     7 except ZeroDivisionError as e:  # 通过 as 变量名 获取异常的对象
     8     print("出现异常-->除数不能为零")
     9     print("异常的提示信息-->", e)
    10 except:
    11     pass
    12 print("----------")
    13 
    14 
    15 # 输出结果
    16 转换后的值nu: 100
    17 出现异常-->除数不能为零
    18 异常的提示信息--> division by zero
    19 ----------

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

     1 try:
     2     i = 1 / 0
     3     nu = int("aa")
     4 except (ValueError, ZeroDivisionError) as e:
     5     print(e)
     6 except:
     7     pass
     8 print("----------")
     9 
    10 
    11 # 输出结果
    12 division by zero
    13 ----------

    2)try-except-else-finally 语句

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

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

     1 try:
     2     i = 1 / 0
     3     print("没有出现异常i值", i)
     4 except Exception as e:
     5     print("出现异常-->", e)
     6 else:
     7     print("没有出现异常-->执行else")
     8 finally:
     9     print("不管是否出现异常,这里的语句一定会被执行")
    10 
    11 
    12 # 输出结果
    13 出现异常--> division by zero
    14 不管是否出现异常,这里的语句一定会被执行

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

     1 try:
     2     i = 1 / 1
     3     print("没有出现异常i值", i)
     4 except Exception as e:
     5     print("出现异常-->", e)
     6 else:
     7     print("没有出现异常-->执行else")
     8 finally:
     9     print("不管是否出现异常,这里的语句一定会被执行")
    10 
    11 
    12 # 输出结果
    13 没有出现异常i值 1.0
    14 没有出现异常-->执行else
    15 不管是否出现异常,这里的语句一定会被执行

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

    4、异常的传递

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

     1 def test2():
     2     int("aa")
     3 
     4 def test1():
     5     test2()
     6 
     7 try:
     8     test1()
     9 except Exception as e:
    10     print(e)
    11 print("-----------")
    12 
    13 
    14 # 输出结果
    15 invalid literal for int() with base 10: 'aa'
    16 -----------

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

    5、抛出异常 raise

    1)抛出python已定义的异常

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

     1 age = 500
     2 try:
     3     if age < 0 or age > 200:
     4         raise ValueError("age范围0-200")
     5     print("age", age)
     6 except ValueError as e:
     7     print("出现异常-->", e)
     8 
     9 
    10 # 输出结果
    11 出现异常--> age范围0-200

    2)抛出自定义异常

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

     1 class MyException(Exception):  # 自定义异常类
     2     def __init__(self, msg):
     3         self.msg = msg
     4 
     5 
     6 age = 500
     7 try:
     8     if age < 0 or age > 200:
     9         raise MyException("age范围0-200")  # 抛出自定义异常
    10     print("age", age)
    11 except MyException as e:
    12     print("出现异常-->", e)
    13 
    14 
    15 # 输出结果
    16 出现异常--> age范围0-200

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

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

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

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

     1 try:
     2     i = 1 / 0  # 异常的语句
     3 except Exception as e:
     4     print("出现异常-->", e)
     5     raise  # 处理完后继续抛出异常,raise表示抛出当前异常
     6 print("-------------")
     7 
     8 
     9 # 输出结果
    10 出现异常--> division by zero
    11 Traceback (most recent call last):
    12   File "<stdin>", line 2, in <module>
    13     i = 1 / 0
    14 ZeroDivisionError: division by zero

    注:异常处理尽量在需要的时候再使用,使用太多会影响代码的可读性

  • 相关阅读:
    常用AIX论坛地址介绍
    向日葵任务甘特图 http://www.51diaodu.cn/
    centos 中tomcat加入自启动​【转】
    徐州出差几天
    Unit OneC
    周末来了~
    北京展览馆参加第6届石油石化装备展览会
    王心凌 我会好好的 cyndi with u
    VS中Debug与Release、_WIN32与_WIN64的区别
    c语言中<stdbool.h>的使用
  • 原文地址:https://www.cnblogs.com/yhongji/p/9707318.html
Copyright © 2011-2022 走看看