您当前的位置: 首页 >  Python

IT之一小佬

暂无认证

  • 0浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

python中的异常(try...except...else...finally)

IT之一小佬 发布时间:2021-01-31 11:29:00 ,浏览量:0

1. 什么是异常
        当检测到⼀个错误时,解释器就⽆法继续执⾏了,反⽽出现了⼀些错误的提示,这就是所谓的" 异常 " 。
例如:以 r ⽅式打开⼀个不存在的⽂件。
open('test.txt', 'r')

运行效果:

2. 异常的写法 2.1 异常语法
try:
   可能发⽣错误的代码
except:
   如果出现异常执⾏的代码
示例需求:尝试以 r 模式打开⽂件,如果⽂件不存在,则以 w ⽅式打开。
try:
   f = open('test.txt', 'r')
except:
   f = open('test.txt', 'w')
2.2 捕获指定异常

语法:

try:
   可能发⽣错误的代码
except 异常类型:
   如果捕获到该异常类型执⾏的代码

示例代码:

try:
   print(num)
except NameError:
   print('有错误')
注意:

1. 如果尝试执⾏的代码的异常类型和要捕获的异常类型不⼀致,则⽆法捕获异常。

2. ⼀般try下⽅只放⼀⾏尝试执⾏的代码。

2.3 捕获多个指定异常
        当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使⽤元组的⽅式进⾏书写。
try:
   print(1/0)
except (NameError, ZeroDivisionError):
   print('有错误')
2.4 捕获异常描述信息
try:
   print(num)
except (NameError, ZeroDivisionError) as result:
   print(result)
2.5 捕获所有异常
        Exception是所有程序异常类的⽗类。
try:
   print(num)
except Exception as result:
   print(result)
2.6 异常的else
        else表示的是如果没有异常要执⾏的代码。
try:
   print(1)
except Exception as result:
   print(result)
else:
   print('我是else,是没有异常的时候执⾏的代码')
2.7 异常的finally
        finally表示的是⽆论是否异常都要执⾏的代码,例如关闭⽂件。
try:
   f = open('test.txt', 'r')
except Exception as result:
   f = open('test.txt', 'w')
else:
   print('没有异常,真开⼼')
finally:
   f.close()
2.8 多个异常判断

        在程序执行过程中,如果有多重except判断的话,可以使用多次except。

示例代码1:

def func():
    tmp = 0
    try:
        tmp = tmp / 0
        print(num)  # ⼀般try下⽅只放⼀⾏尝试执⾏的代码,出现异常的语句后,下面的语句不再执行
        tmp = tmp + 1
    except NameError as e:
        print(e)
    except ZeroDivisionError as e:
        print(e)
    except Exception as e:
        print(e)
    else:
        print("I am OK!")
    finally:
        print("End the program!")
    return tmp


ret = func()
print(ret)

运行结果:

示例代码2:

def func():
    tmp = 0
    try:
        # tmp = tmp / 0
        print(num)  # ⼀般try下⽅只放⼀⾏尝试执⾏的代码,出现异常的语句后,下面的语句不再执行
        tmp = tmp + 1
    except NameError as e:
        print(e)
    except ZeroDivisionError as e:
        print(e)
    except Exception as e:
        print(e)
    else:
        print("I am OK!")
    finally:
        print("End the program!")
    return tmp


ret = func()
print(ret)

运行结果:

示例代码3:

def func():
    tmp = 0
    try:
        # tmp = tmp / 0
        # print(num)  # ⼀般try下⽅只放⼀⾏尝试执⾏的代码,出现异常的语句后,下面的语句不再执行
        tmp = tmp + 1
    except NameError as e:
        print(e)
    except ZeroDivisionError as e:
        print(e)
    except Exception as e:
        print(e)
    else:
        print("I am OK!")
    finally:
        print("End the program!")
    return tmp


ret = func()
print(ret)

运行结果:

3. 异常的传递
示例需求:

1. 尝试只读⽅式打开test.txt⽂件,如果⽂件存在则读取⽂件内容,⽂件不存在则提示⽤户即可。

2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到⽤户意外终⽌程序,则 except 捕获异常并提示⽤户。

import time
try:
   f = open('test.txt')
   try:
      while True:
          content = f.readline()
          if len(content) == 0:
              break
          time.sleep(2)
          print(content)
   except:
      # 如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到
      # ⽐如 按下了 ctrl+c
      print('意外终⽌了读取数据')
   finally:
      f.close()
      print('关闭⽂件')
except:
   print("没有这个⽂件")
4. ⾃定义异常
在 Python 中,抛出⾃定义异常的语法为 raise 异常类对象 。
示例需求:密码⻓度不⾜,则报异常(⽤户输⼊密码,如果输⼊的⻓度不⾜ 3 位,则报错,即抛出⾃定义异常,并捕获该异常)。
# ⾃定义异常类,继承Exception
class ShortInputError(Exception):
    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len

    # 设置抛出异常的描述信息
    def __str__(self):
        return f'您输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'


def main():
    try:
        con = input('请输⼊密码:')
        if len(con) < 3:
            raise ShortInputError(len(con), 3)
    except Exception as result:
        print(result)
    else:
        print('密码已经输⼊完成')


main()

运行结果:

关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0411s