python----有关异常的基础

Posted 蕊在花中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python----有关异常的基础相关的知识,希望对你有一定的参考价值。

异常捕获

  • 使用try和except可以捕获异常,也就是在出现异常后不会将代码终止运行,而是执行except中的代码处理异常

# 异常捕获:通过代码将可能出现异常的文件放入try中,然后如果出现异常就执行except中的命令
\'\'\'
格式:
try:
  可能出现异常的代码
except:
  如果出现了异常,就执行其中的代码
\'\'\'

# 需求:读取文件,如果文件不存在,则以写入方式打开
# 如果我们try中的代码出现了异常,则执行except中的命令
# 如果我们try中的代码没有出现异常,则不会执行
try:
   file = open(\'test.py\', \'r\')
except:
   file = open(\'test.py\', \'w\')

# 在正常的Python开发中基本每个函数中都要出现一次异常捕获
# 代码健壮性:代码抵御异常的能力

捕获指定类型的异常

  • 在except后边添加异常类型,就可以捕获指定类型的异常

  • 如果我们想要捕获多种异常

    • 可以在except后边添加多个异常类型,中间用逗号隔开,但是需要用括号包裹,变成一个元组

    • 可以书写多个except

  • 如果所有的异常类型都无法捕获到该异常, 或者我们需要捕获未知类型的异常,可以使用Exception

# try:
#     # NameError: name \'a\' is not defined
#     # 如果先出现NameError 我们的后边一句没有办法执行 ZeroDivisionError没有办法捕捉到
#     # print(a)
#     print(1/0)
# # 如果想要捕获指定异常,就在except 后边添加异常的类型
# except ZeroDivisionError: # 这种方式只能捕获指定异常
#     print(\'出现异常了!!!\')

# 在出现异常后, NameError和 ZeroDivisionError 之类的Error就是异常类型
# ZeroDivisionError: division by zero
# print(1/0)
# NameError: name \'a\' is not defined
# print(a)


# 能不能同时捕获多种异常呢? 可以
# 方法一:在except后边添加多个异常名称
# try:
#     # NameError: name \'a\' is not defined
#     # 如果先出现NameError 我们的后边一句没有办法执行 ZeroDivisionError没有办法捕捉到
#     # print(a)
#     print(1 / 0)
# # 如果想要捕获指定异常,就在except 后边添加异常的类型
# except (ZeroDivisionError, NameError): # 这种方式只能捕获指定异常
#     print(\'出现异常了!!!\')

# 方法二: 在try后边书写多个except
# try:
#     # NameError: name \'a\' is not defined
#     # 如果先出现NameError 我们的后边一句没有办法执行 ZeroDivisionError没有办法捕捉到
#     # 在出现异常之后,后续代码将不会继续执行
#     print(a)
#     print(1 / 0)
# # 如果想要捕获指定异常,就在except 后边添加异常的类型
# except ZeroDivisionError:
#     print(\'出现ZeroDivisionError异常了!!!\')
# except NameError:
#     print(\'出现NameError异常!!\')

# 如果我们想要展示异常信息怎么办?
# 异常信息就是异常类型冒号之后的注释
# 可以通过获取异常对象,并对异常对象进行打印,得到异常信息
# try:
#     print(a)
#     print(1 / 0)
# # 如果想要捕获指定异常,就在except 后边添加异常的类型
# # 在异常类型之后添加上个as 变量名 这时候 变量就是异常对象,打印该对象就可以出现错误信息
# except ZeroDivisionError as error:
#     print(error) # division by zero
# except NameError as error:
#     print(\'出现NameError异常!!\', error)

# 如果我们不知道异常类型是什么怎么办?

# 可以使用Exception进行捕获,Exception是所有异常类的父类,可以捕获所有异常类型

try:
   print(\'2\' + 1)
   print(a)
   print(1 / 0)
except ZeroDivisionError as error:
   print(error)  # division by zero
except NameError as error:
   print(\'出现NameError异常!!\', error)
except Exception:
   print(\'出现了未知异常\')

else 和 finally

  • else: try中控制的代码没有出现异常,则执行该结构内的代码

\'\'\'
格式:
try:
  可能会出现异常的代码
except:
  在出现异常后执行该命令处理异常
else:
  当没有出现异常时,执行该代码
\'\'\'

try:
   a = 1
   print(a)
except:
   print(\'出现异常了\')
else:
   # try中的代码正常执行没有任何异常,则执行else里边的代码
   print(\'没有异常,虚惊一场\')
  • finally:无论出现什么情况都会执行finally里边的代码,哪怕程序崩溃

\'\'\'
try:
  可能出现异常的代码
except:
  代码出现异常后执行该代码处理异常
else:
  如果try中的代码不出现异常,则执行其中的代码
finally:
  无论如何都会执行finally中的代码
\'\'\'

# 无论任何情况,finally中的代码都要被执行
try:
   a = 1
   print(a)
   print(1/0)
except NameError:
   print(\'出现异常了\')
else:
   print(\'没有出现异常\')
finally:
   print(\'出现不出现异常都要执行\')
# 代码写到finally中,哪怕程序报错终止,代码依旧需要执行完成,但是写到try结构之外,程序报错终止将不会继续执行外部代码
print(\'try结构之外书写内容\')

自定义异常抛出

  • 自定义异常一定要继承自Exception

  • 自定义异常可以使用raise抛出,可以进行捕获或者导致程序终止

  • raise可以抛出系统异常,也可以抛出自定义异常

# 自定义异常的逻辑
# 在自定义异常时,只要继承自Exception就可以当做异常抛出
# 继承后要重写 Exception方法,添加我们需要的内容

class PassWorldError(Exception):
   error_count = 0

   def __init__(self, str):
       super().__init__(str)
       # 在此处可以添加自定义操作
       PassWorldError.error_count += 1

# raise可以手动抛出异常,抛出异常后,可以直接终止程序,或者使用try except进行捕获
# raise可以抛出自定义异常,也可以抛出系统异常
try:
   password = input(\'请输入您的密码:\')
   if len(password) < 6:
       raise PassWorldError(\'您的密码不足6位,请重新输入\')
       # raise NameError(\'您的密码错误了\')
except PassWorldError as error:
   print(error)

# raise PassWorldError(\'密码错误\')

 

以上是关于python----有关异常的基础的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 代码片段编写 LaTeX 文档

你如何在 python 中处理 graphql 查询和片段?

零基础学Python--------第9章 异常处理及程序调试

Python基础---异常

Python基础编程239 ● 异常 ● 异常语句中else语句的使用

Python基础:异常处理