异常的相关知识

  • 博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
  • 努力努力再努力嗷~~~✨

大纲

⭕总结了python中所有可能的异常情况,有异常不一定是坏事,有提醒作用

一、常见异常

可以查看python内置异常大合集

  • 除0运算:ZeroDivisionError
  • 找不到可读文件:FileNotFoundError
  • 值错误:ValueError
  • 索引错误:IndexError
  • 类型错误:TypeError
  • 使用一个未被定义的变量:NameError
  • 试图访问字典里不存在的键:KeyError

⚠️当异常发生的时候,如果不预先设定处理方法,程序就会中断

二、处理异常:提高程序的稳定性和可靠性

(一)try_except

如果try内代码块顺利执行,except不被触发;如果try内代码块发生错误,执行except里的代码

通过预判的方式来处理异常,一般来说会预判到出现什么错误,预判错误的话还是会中止程序

x = 10
y = 0
try:
    z = x/y
except ZeroDivisionError: 
    print("0不可以被除!")    

 ⚠️只预判一个异常,很难预判到,所以就可以多写几个

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
    ls[3]
    d["age"]
except NameError:
    print("变量名不存在")
except IndexError:
    print("索引超出界限")
except KeyError:
    print("键不存在")

⚠️ 就算多写几个,还是很难预判到是什么类型的错误,可以使用Exception

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
    ls[3]
    d["age"]
except Exception:
    print("出错啦") # 有错就报错

⚠️ 虽然知道了错误,但是不知道是哪种类型的错误,可以使用as来捕获异常的值

ls = []
d = {"name": "鲁班七号"}
# y = x
try:
    y = m
    # ls[3]
    # d["age"]
except Exception as e: # 虽不能获得错误具体类型,但可以获得错误的值
    print(e) # name 'm' is not defined

(二)try_except_else

如果try 模块执行,则else模块也执行(更像是对于try模块的继续表达或后续声明)

try:
    with open("测试文件.txt") as f:
        text = f.read()
except FileNotFoundError:
    print("找不到该文件")
else:
    for s in ["\n", ",", "。", "?"]: # 去掉换行符和标点符号
        text = text.replace(s, "")
    print("该文件共由{}个字组成。".format(len(text)))

(三)try_except_finally

不论try模块是否执行,finally最后都执行

finally一般都是执行收尾工作,比如文件的关闭

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
except Exception as e:
    print(e)
finally:
    print("哎~我一直都在")

⭕总结

异常的相关知识_第1张图片

 异常的相关知识_第2张图片

三、异常的嵌套

看内部异常与外部异常哪个先发生,若外部异常先发生直接跳过内部异常,执行finally语句

try:
    try:
        520 + "FishC"
    except:
        print("内部异常")
    1 / 0
except:
    print("外部异常")
finally:
    print("收尾工作")
'''
内部异常
外部异常
收尾工作
'''
try:
    1 / 0
    try:
        520 + "FishC"
    except:
        print("内部异常")
except:
    print("外部异常")
finally:
    print("收尾工作")
'''
外部异常
收尾工作
'''

四、raise语句 

(一)主动引发异常

在上述情况下的异常都是采用被动防御的姿态,可以使用raise语句来进行“自爆”,这种情况不能引爆一个不存在的异常类型

raise ValueError("值不正确")
'''
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[5], line 1
----> 1 raise ValueError("值不正确")

ValueError: 值不正确
'''
raise FishCError("小甲鱼")
'''
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[7], line 10
      1 # raise ValueError("值不正确")
      2 '''
      3 ---------------------------------------------------------------------------
      4 ValueError                                Traceback (most recent call last)
   (...)
      8 ValueError: 值不正确
      9 '''
---> 10 raise FishCError("小甲鱼")

NameError: name 'FishCError' is not defined
'''

(二)偷天换日:用一个异常来替换真正的异常

这种情况python其实会自己识别,并说明是哪种异常

try:
    1 / 0
except:
    raise ValueError("这样可不行")
'''
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[8], line 2
      1 try:
----> 2     1 / 0
      3 except:

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
Cell In[8], line 4
      2     1 / 0
      3 except:
----> 4     raise ValueError("这样可不行")

ValueError: 这样可不行
'''

(三)异常链

raise ValueError("这样可以不行") from ZeroDivisionError
'''
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
ZeroDivisionError: 

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
Cell In[9], line 1
----> 1 raise ValueError("这样可以不行") from ZeroDivisionError

ValueError: 这样可以不行
'''

五、assert语句 

能主动引发异常,但是assert语句只能引发一个叫AssertionError的异常

多用于调试的时候,可以代替if语句的作用

s = "FishC"
assert s == "FishC"
assert s != "FishC"

六、利用异常来实现goto

try:
    while True:
        while True:
            for i in range(10):
                if i > 3:
                    raise # 这里相当于goto语句
                print(i)
            print("跳过")
        print("跳过")
    print("跳过")
except:
    print("这里")
'''
0
1
2
3
这里
'''

 欢迎点赞 收藏 ⭐留言 如有错误敬请指正!

你可能感兴趣的:(python,数学建模,java,python,人工智能,开发语言)