Python异常介绍

2023-12-21 13:07:52

0. 标题

Python异常介绍 (id:3)

作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

1. 什么是异常

简单来说,异常就是程序出现了不正常的情况。
如果程序出现了问题或者错误,我们没有做任何处理,程序就会终止执行。

Python有两种错误很容易辨认:语法错误和异常。
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

  1. Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
  2. 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
  3. 一般情况下,在Python无法正常处理程序时就会发生一个异常。
  4. 异常是Python对象,表示一个错误。

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

2. 异常处理

2.1 Try-except-else-finally blocks

2.1.1 try-except

常见的异常处理方式,是try-except:

try:
    尝试执行的代码
except:
    出现错误的处理

2.1.1 try-except 针对指定异常类型的处理

在程序执行时,可能会遇到不同类型的,并且需要针对不同类型的异常,做出不同的响应,这个时候就需要指定错误类型了:

try:
    #尝试执行的代码
    pass
except 错误类型1:
    #针对错误类型1,对应的代码处理
    pass
except(错误类型2,错误类型3):
    #针对错误类型2 和3 对应的代码处理
    pass
except Exception as result:
    print("未知错误 %s" %result)

上面例子中,最后一个except,是对于没有指定的异常类型,做的统一处理。

2.1.3 try-except-else-finally

finally 语句无论异常是否发生都会被执行,它常用来做清理动作,比如关闭文件描述符或者网络套接字:

try:
    assert 1==1
except:
    print('except!')
else:
    print('else!')
finally:
    # #无论是否有异常,都会执行的代码
    print('finally!')
  
# else!
# finally!

这是python中处理异常的完整表达方式,如果except被执行,else就不会被执行;finally总是会被执行。

2.1.4 异常的更多信息获取

对于异常,我们可以打印更多的信息,比如:

try:
    1 / 0
except Exception as inst:
    print(type(inst))     # the exception instance
    print(type(inst.args))
    print(inst.args)      # arguments stored in .args
    print(inst)

>>>
<class 'ZeroDivisionError'>
<class 'tuple'>
('division by zero',)
division by zero

2.2 assert 断言

assert 1==2

# Traceback (most recent call last):
#   File "/Users/lzl/Documents/repos/test/a.py", line 1, in <module>
#     assert 1==2
# AssertionError

可以看到,当assert语句为False后,会抛出一个AssertionError的异常。

如果我们再断言的语句后,添加一个逗号和一个字符串,这个字符串会当成断言的提示信息,打印到异常输出中:

assert 1==2, 'this is an assertion message'

# Traceback (most recent call last):
#   File "/Users/lzl/Documents/repos/test/a.py", line 1, in <module>
#     assert 1==2, 'this is an assertion message'
# AssertionError: this is an assertion message

2.3 让程序忽略assert断言语句

python3 -O your_script.py

通过添加 “-O” 标记,可以让python程序忽略代码里面的所有assert语句。

作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

2.4 异常的继承

因为异常是Python对象,所以异常是有类的继承关系的。
我们可以打印出来常用异常的父类或者子类信息:

print(ZeroDivisionError.__bases__)
# (<class 'ArithmeticError'>,)

print(ArithmeticError.__bases__)
# (<class 'Exception'>,)

print(Exception.__bases__)
# (<class 'BaseException'>,)

print(BaseException.__bases__)
# (<class 'object'>,)

print(Exception.__subclasses__())

# [<class 'ArithmeticError'>,
#  <class 'AssertionError'>,
#  <class 'AttributeError'>,
#  <class 'BufferError'>,
#  <class 'EOFError'>,
#  <class 'ImportError'>,
#  <class 'LookupError'>,
#  <class 'MemoryError'>,
#  <class 'NameError'>,
#  <class 'OSError'>,
#  <class 'ReferenceError'>,
#  <class 'RuntimeError'>,
#  <class 'StopAsyncIteration'>,
#  <class 'StopIteration'>,
#  <class 'SyntaxError'>,
#  <class 'SystemError'>,
#  <class 'TypeError'>,
#  <class 'ValueError'>,
#  <class 'Warning'>,
#  <class 'ExceptionGroup'>,
#  <class 're.error'>,
#  <class 'copy.Error'>,
#  <class 'warnings._OptionError'>,
#  <class 'tokenize.TokenError'>,
#  <class 'tokenize.StopTokenizing'>,
#  <class 'inspect.ClassFoundException'>,
#  <class 'inspect.EndOfBlock'>]

2.5 异常信息链

raise语句有一个可选的from子句。此子句允许将引发的异常与作为from的参数提供的第二个异常连接起来。
注意,如果使用from子句,则它的参数必须是返回异常类或实例的表达式。
通常在except代码块中使用from将引发的异常与活动异常链接起来。

Raise exception (args) from original_exception

try:
    result = 42 / 0
except Exception as error:
    raise ValueError("operation not allowed") from error

'''
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero

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

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: operation not allowed
'''

2.6 异常的传递

  1. 当函数/方法执行出现异常时,会将异常传递给函数/方法的调用一方
  2. 如果传递到主程序,仍然没有异常处理,程序才会被终止
  3. 所以说,只需要在主程序中做一个异常处理就可以完成代码的异常处理

3. 作者信息

作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

文章来源:https://blog.csdn.net/quant_galaxy/article/details/135127298
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。