Python(五)之错误和异常

申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

语法错误

在python中如果错误信息以"SynataxError"开头,说明python解释器认为这是一个语法错误,同时会提示你在哪个文件的哪一行开始出错。语法错误通常意味着我们使用python书写格式或者使用方法不正确。

print:

执行结果:
  File "E:\Python\Study\error.py", line 1
    print:
          ^
SyntaxError: invalid syntax

异常

即使python程序的语法是正确的,但是在运行的时候也可能发生一些预想之外的错误。运行时检测到的错误被称为异常,有些错误可能不是致命的,但如果程序员对异常不错处理,python解释器会输出异常到控制台上并终止程序。

python标准异常:

  • BaseException: 所有异常的基类
  • SystemExit: 解释器请求退出
  • KeyboardInterrupt: 用户中断执行(通常是输入^C)
  • Exception: 常规错误的基类
  • StopIteration: 迭代器没有更多的值
  • GeneratorExit: 生成器(generator)发生异常来通知退出
  • StandardError: 所有的内建标准异常的基类
  • ArithmeticError: 所有数值计算错误的基类
  • FloatingPointError: 浮点计算错误
  • OverflowError: 数值运算超出最大限制
  • ZeroDivisionError: 除(或取模)零 (所有数据类型)
  • AssertionError: 断言语句失败
  • AttributeError: 对象没有这个属性
  • EOFError: 没有内建输入,到达EOF 标记
  • EnvironmentError: 操作系统错误的基类
  • IOError: 输入/输出操作失败
  • OSError: 操作系统错误
  • WindowsError: 系统调用失败
  • ImportError: 导入模块/对象失败
  • LookupError: 无效数据查询的基类
  • IndexError: 序列中没有此索引(index)
  • KeyError: 映射中没有这个键
  • MemoryError: 内存溢出错误(对于Python 解释器不是致命的)
  • NameError: 未声明/初始化对象 (没有属性)
  • UnboundLocalError: 访问未初始化的本地变量
  • ReferenceError: 弱引用(Weak reference)试图访问已经垃圾回收了的对象
  • RuntimeError: 一般的运行时错误
  • NotImplementedError: 尚未实现的方法
  • SyntaxError: Python 语法错误
  • IndentationError: 缩进错误
  • TabError: Tab 和空格混用
  • SystemError: 一般的解释器系统错误
  • TypeError: 对类型无效的操作
  • ValueError: 传入无效的参数
  • UnicodeError Unicode: 相关的错误
  • UnicodeDecodeError: Unicode 解码时的错误
  • UnicodeEncodeError: Unicode 编码时错误
  • UnicodeTranslateError: Unicode 转换时错误
  • Warning: 警告的基类
  • DeprecationWarning: 关于被弃用的特征的警告
  • FutureWarning: 关于构造将来语义会有改变的警告
  • OverflowWarning: 旧的关于自动提升为长整型(long)的警告
  • PendingDeprecationWarning: 关于特性将会被废弃的警告
  • RuntimeWarning: 可疑的运行时行为(runtime behavior)的警告
  • SyntaxWarning: 可疑的语法的警告
  • UserWarning: 用户代码生成的警告

处理异常

使用try和except关键字捕获异常并让我们运行相应的代码去处理异常。

try:
	业务语法块
except 异常类型:
	处理异常语法块

在try业务块语法中产生的异常都会终止业务语法块并跳转到except匹配异常类型,如果能匹配上,则运行处理异常的语法块,否则程序报错退出。

number = int(input('请输入一个数字:'))
print(number)

执行结果:
请输入一个数字:a
    number = int(input('请输入一个数字:'))
ValueError: invalid literal for int() with base 10: 'a'
try:
    number = int(input('请输入一个数字:'))
    print(number)
except ValueError:
    print('输入了无效的数字', ValueError)
except Exception as e:
    print('输出错误', e)
    
执行结果:
请输入一个数字:a
输入了无效的数字 <class 'ValueError'>

上面就是一个处理异常的例子,首先在try中编写我们的业务逻辑代码,然后根据错误类型定义多个异常处理的except语句块。如果有多个except,那么python解释器会逐个匹配except后的异常类型,匹配到则运行相应的处理异常的语法块,没有匹配到则输出异常并退出程序。由于大部分异常都是从Exception这个父类继承过来的,所有匹配的异常类型是Exception,大部分几率是能匹配到异常的。

finally子句

python中的finally子句需要和try子句搭配着一起使用。finally子句在异常处理中的作用是:无论是否有异常或者是否捕获了异常,finally子句都会执行。

for i in range(2):
    try:
        number = int(input('请输入一个数字:'))
        print(number)
    except Exception as e:
        print('捕获到了异常', e)
    finally:
        print('finally子句执行')
        
执行结果:
请输入一个数字:1
1
finally子句执行

请输入一个数字:a
捕获到了异常 invalid literal for int() with base 10: 'a'
finally子句执行

自定义异常

  • 定义我的自定义异常
    class MyException(Exception):
        def __init__(self):
            pass
    
    	# 当使用print输出对象的时候,若定义了__str__(self)方法,打印对象时就会从这个方法中打印出return的字符串数据。
        def __str__(self):
            return '我自定义的异常'
    
    # raise语句用来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类。
    def raise_customer_exception():
        raise MyException()
    
    raise_customer_exception()
    
    执行结果:
    Traceback (most recent call last):
      File "E:\Python\Study\error.py", line 23, in <module>
        raise_customer_exception()
      File "E:\Python\Study\error.py", line 20, in raise_customer_exception
        raise MyException()
    __main__.MyException: 我自定义的异常
    
  • 使用我的自定义异常
    class MyException(Exception):
        def __init__(self):
            pass
    
    def raise_customer_exception():
        raise MyException()
    
    try:
        raise_customer_exception()
    except MyException as e:
        print('自定义的异常', e)
    
    执行结果:
    自定义的异常
    

一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!

如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拿头来坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值