Python异常基础(一)

文章目录(PS:觉得不错请点赞收藏支持一下)

一、异常基础

1.1 错误

在敲写代码过程中,相信很多人都碰过壁,因为总是要出错的嘛,出现错误不要急躁,一步一步去调试,当你解决了这个问题,你会发现快乐加倍

  • 错误分为两种
    • 语法错误
    • 异常
  1. 语法错误
while True
    print('hello')

# 报错信息: SyntaxError: invalid syntax   
!!意思是无效语法!!

不过现在的编辑器做的都很好,语法错误都会给出提示,能更好的避免这些问题。

  1. 异常
  • 概述:代码编写阶段没有问题,代码运行阶段出现了错误,Python 解释器会抛出异常错误信息。
  • 举例:

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

# 报错信息: FileNotFoundError: [Errno 2] No such file or directory: 'aa.txt'
什么意思呢?  大概意思就是当前目录没有此文件

1.2 处理异常

想一想,我们应该需要做什么呢?

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

那我们该如何操作呢?别急,Python 编程语言呢有内置的方法,我来教你

如何获取异常信息?
使用 try...except 组合进行处理
1. 将可能发生异常的代码放到 try 中
2. 使用 except 捕获异常: 意思就是 try 中的代码一旦出错,就自动跳转到 except 中; 
如果 try 中的代码没有发生错误,则不执行 except 中的代码

# 语法
try:
	代码
except 异常类型:
	代码

方法告诉你了,让我们来动手写一写

try:
    res = open('aa.txt', 'r')
except:
    print('出错了')
    
# 运行结果: 出错了
是不是控制台没有出现红色的信息,感觉很舒适了一些~

二、捕获异常

2.1 内置异常类型

不给大家一个一个举例子了,直接看图,这些是我总结的一些比较常见的异常类型,眼熟它即可,因为时间很长,你要与它陪伴很久很久~

ZeroDivisionError   除零错误

TypeError          类型错误

AttributeError  属性错误

NameError     变量名错误

SyntaxError    语法错误

KeyError    字典键名错误

IndexError  索引错误

IndentationError  缩进错误

TabError 空格和Tab混用

OSError 系统错误

ValueError    传入无效的参数

2.2 捕获指定异常

慢下来,思考一下,Python 开发者为什么要内置异常类型呢?

# 为什么要内置异常类型
如果仅仅使用 try...except 虽然可以捕获异常,但是无法知道具体的异常信息,非常不利于后面处理错误,在 except 后面加上异常类型,就可以捕获到指定的异常信息

举一个变量类型异常的例子吧

try:
    print(number)
except NameError:
    print('没有定义变量')
# 运行结果: 没有定义变量
咱们这里只是举个简单的例子方便大家理解,在编辑器敲写时,number 变量就已经标注红色了

2.3 捕获多个指定异常

虽然捕获了指定的异常,但是却无法捕获其他的异常,怎么办? Python 开发者前辈早已开发好了方法供我们使用

try:
    print(number)
except (ZeroDivisionError,FileNotFoundError,NameError):
    print('发生错误')
    
# 运行结果: 发生错误

2.4 捕获所有异常

看到标题是不是在想,wcnb,多么的人性化,学了之后是真的快乐加倍

try:
    print(number)
except Exception:
    print('发生了错误')
    
# 运行结果: 发生了错误

2.5 捕获异常描述信息

上述案例,无论是哪种错误,最后输出的结果都是自己先写好的,那可不可以获取不同异常的错误信息呢? 答案是可以的,Python 【yyds】

1. 语法

# 
try:
	代码
except 异常类型 as xx:
	代码

2. 举例

# 例1
try:
    print(number)
# as 声明后面的变量名,变量名可以随意命名,意思就是将 Exception 捕获的异常错误信息赋值给了 result, 然后 print 输出就可以了
except Exception as result:  
    print(result)
    
# 运行结果: name 'number' is not defined

# 例2
try:
    print(10 / 0)
except Exception as result:
    print(result)

# 运行结果: division by zero

2.6 异常的 else方法 和 finally 方法

相信 else 方法大家都不陌生,条件判断语句 if esle 写了太多次了,几乎离不开它,那它的作用在异常里面又是怎样的呢?

1. 结构

try:
	可能发生错误的代码
except:
	如果出现异常执行的代码
else:
	没有出现异常要执行的代码
finally:
	无论是否出现异常都要执行的代码
	

2. 举例

try:
    print('hello')
except Exception as result:
    print(result)
else:
    print('代码正常执行')
finally:
    print('我每次都要执行')
    

三、异常嵌套

嵌套这个词,几乎前面每次讲一个知识,都会有嵌套,比如: if嵌套语句,for 循环嵌套语句,while循环嵌套语句,列表嵌套,字典嵌套…等等,异常也如它们一样。

# 例1
"""
首先让用户输入年龄,正常的话则继续让用户输入身高,不正常则捕获异常,这个举例有些勉强,为了简单的向大家介绍 异常嵌套,就先这样吧,往后当你工作时,你会常用到的。
"""
try:
    age = int(input('输入年龄:'))
    try:
        height = int(input('输入身高(cm):'))
    except:
        print('身高输入有误')
    else:
        print(f'年龄:{age},身高:{height}')
except:
    print('年龄必须是数字')

四、自定义异常

如何使用?

  • 创建自定义异常类,继承 Exception
  • 重写 __str__方法,返回错误描述信息
  • 使用 raise 抛出自定义异常
    1. 语法
raise 异常类对象

2. 举例

class ShorInputError(Exception):
    def __str__(self):
        # 返回 如果密码长度 < 3 时要向用户展示错误信息
        return f'密码长度不能小于3'

try:
    password = input('输入密码:')
    if len(password) < 3:
        """
        raise 后面跟一个异常类型的实例,用于抛出此类型的异常,好让 except 捕获异常
        也就是说,将代码的控制权移交给 except
        """
        raise ShorInputError()
except Exception as result:
    # result 就是自定义异常类中 str 方法返回的错误信息
    print(result)
上一篇:浅析Python谷歌翻译库的核心


下一篇:Python进阶|聊聊异常处理