Python语法错误和异常

Source

语法错误和异常

异常和错误

错误分为两种:语法错误与异常

  1. 语法错误:指拼写代码时发生的漏写,错写以及中英文符号的拼写错误
    例如:
while True
    print('hello')

4rWYxf.png
如上代码就是在拼写过程中发生的语法错误
语法错误,IDE 可以给出提示
2. 异常:代码编写过程中没有发生错误,但在代码运行中发生的错误叫异常
例如:

res = open('aa.txt', 'r')

4rWzFA.png
如上代码就是在运行时出现的异常

异常:代码编写阶段没有问题,而是在代码运行阶段出现的错误,Python 解释器会抛出异常信息

在开发阶段,异常信息可以显示,但项目上线后,异常信息不能显示,可以将异常信息写道某个文件中,这也是对异常信息的一种处理方式

抛出异常:当程序停止运行并在控制台提示错误信息时,我们称之为抛出异常

处理异常

如果相对异常进行处理,需要:

  • 让异常信息不要显示在页面上
  • 能够获取异常信息,然后针对性的进行处理,如写入日志文件等

如何获取异常信息?
使用 try…except 组合进行处理

  • 将可能发生异常的代码放到 try 中
  • 使用 except 捕获异常:就是说 try 中代码一旦出错,就会自动跳转到 except 中;如果 try 中代码没有发生错误,则不会自行 except 中的代码
try:
    res = open('aa.txt', 'r')
    # a = 10
except:
    print('出错了')

4s9LX8.png
如上代码就是处理异常的写法
将可能发生异常的代码放入try中在使用except来捕获异常

捕获指定异常

  • 代码运行时的错误有很多种,所以异常也就有很多种,比如:IndexError、KeyError、FileNotFoundError、ZeroDivisionError
  • python 内置了很多的异常类,用来捕获这些错误
  • 为什么要内置异常类型
    • 如果仅仅使用 try…except 虽然可以捕获异常,但是无法知道具体的异常信息,非常不利于后面处理错误
    • 在 except 后面加上 异常类型,就可以捕获到具体的异常信息
  1. IndexError
l1 = [2, 33, 4, 5]
print(l1[6])

4sPKaQ.png

出现IndexError一般是指指定的位置偏移或超出了字符串或列表的长度范围
避免IndexError异常方法为:偏移量或长度不应该超过字符串或列表的最大长度

  1. KeyError
d1 = {
    
      'name': 'yhb'}
print(d1['age'])

4skP54.png

出现KeyError的情况一般是指在字典中查找kry不存在

  1. FileNotFoundError
res = open('a.txt', 'r')

4sAzAU.png

出现FileNotFoundError一般是文件报错异常
Python中出现这种报错异常无异于文件名文件类型出错(例如:aa.txt写成了a.txt或ab.txt;又或者aa.txt写成了aa.md)或者Python字符串的转义在Python字符串中 == \ == 表示转义字符(例如:== \ ==(在行尾时)表示 续航符 )所以在写入文件路径时应在文件路径钱加上 r (例如:r"‪E:\PC\aa.txt")

  1. ZeroDivisionError
print(10 / 0)

4sKoSU.png

任何一个数值被零除都会导致ZeroDivisionError异常

  1. Exception
    所有程序异常类的父类。
try:
    res = open('a.txt', 'r')

    l1 = [2, 33, 4, 5]
    print(l1[6])	#list index out of range 列表索引超出范围

    print(10 / 0)	#division by zero 除数为零
except Exception as result:
    print(result)

except 后面如果指定异常类型,就只能捕获次类型异常,无法捕获其他异常

异常中的else

else表示的是如果没有异常要执行的代码。

try:
    a = 10
    # res = open('a.txt', 'r')	

     l1 = [2, 33, 4, 5]
     print(l1[6])		#list index out of range

     print(10 / 0)		#division by zero
except Exception as result:
    print(result)
else:
    # try 中没有出现异常,就会执行 else 中代码
    print('try 中没有出现异常')

异常的finally

finally表示的是无论是否异常都要执行的代码

  • 案例
    读取文件 a.txt 中内容,并输出
    如果 a.txt 文件不存在,则创建 a.txt ,并向其中写入"i have a dream"
try:
    res = open('a.txt', 'r')
    content = res.read()
    print(content)
except FileNotFoundError as result:
    res = open('a.txt', 'w')
    res.write('I have a dream')
finally:
    print('我总会执行')
    res.close()

自定义异常类型

  • 自定义异常类型要考虑清楚次类型处理哪些错误
  • 在Python中,抛出自定义异常的语法为 raise 异常类对象 。
class ShortInputError(Exception):
    """
    此方法的主要作用是,接受一些参数,以供 str 方法使用,如果 str 方法不需要任何数据,此方法也可以不定义
    """

    def __init__(self):
        pass
        # self.user_length = user_length
        # self.min_length = min_length

    def __str__(self):
        # 返回如果 user_length<min_length 时要向用户展示的错误信息
        return f'密码长度不符合要求'


try:
    password = input('输入密码:')
    if len(password) < 3:
        """
        raise 后面跟一个异常类型的实例,作用是抛出此中类型的异常,好让 except 能够捕获,
        也就是说,将代码的控制权移交给 except        
        """
        raise ShortInputError()
except ShortInputError as result:
    # result 就是自定义异常类中 str 方法返回的错误信息
    print(result)
控制权移交给 except        
        """
        raise ShortInputError()
except ShortInputError as result:
    # result 就是自定义异常类中 str 方法返回的错误信息
    print(result)