Python异常结构_机制_常见异常汇总

一 try_except基本结构

image-20211122185003170

1.1 try…一个except结构

try...except是最常见的异常处理结构。结构如下:

try:
    被监控的可能引发异常的语句块
except BaseException [as e]:
    异常处理语句块

  1. try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常。
  2. 执行的时候,如果try块中没有引发异常,则跳过ecept块继续执行后续代码;
  3. 执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常;异常处理完后,继续执行后续代码。

【示例】遇到异常的执行顺序

#测试简单的0不能做除数异常
try:
  print("step1")
  a = 3/0
  print("step2")
except BaseException as e:
  print("step3")
  print(e)print("step4")

image-20211119185448591

image-20211119185719997

除数为0,遇到异常输出结果:

step1
step3
division by zero
step4

【示例】循环输入数字,如果不是数字则处理异常;直到输入88,则结束循环。

while True:
  try:
    x = int(input("请输入一个数字:"))
    print("您入的数字是",x)
    if x==88:
      print("退出程序")
      break
  except:
    print("异常:输入的不是一个数字")

执行结果:

执行结果:
请输入一个数字:10
您入的数字是 10
请输入一个数字:abc
异常:输入的不是一个数字
请输入一个数字:88
您入的数字是 88
退出程序

1.2 try_多个except结构

image-20211122185024231

上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加BaseException。结构如下:

try:
    被监控的、可能引发异常的语句块
except Exception1:
    处理Exception1的语句块
except Exception2:
    处理Exception2的语句块
​
[...]
except BaseException:
    处理可能遗漏的异常的语句块

【示例】多个except结构

try:
  a = input("请输入被除数:")
  b = input("请输入除数:")
  c = float(a)/float(b)
  print(c)except ZeroDivisionError:
  print("异常:除数不能为0")
except TypeError:
  print("异常:除数和被除数都应该为数值类型")
except BaseException as e:
  print(e)
  print(type(e))

执行结果:

请输入被除数:10
请输入除数:0
异常:除数不能为0

二 else结构

2.1 try…except…else结构

try...except...else结构增加了else块。如果try块中没有抛出异常,则执行else块。如果try块中抛出异常,则执行except块,不执行else块。

【示例】try...except...else结构执行测试

try:
  a = input("请输入被除数:")
  b = input("请输入除数:")
  c = float(a)/float(b)
except BaseException as e:
  print(e)
else:
  print("除的结果是:",c)

发生异常的执行情况(执行except块,没有执行else):

请输入被除数:5
请输入除数:0
float division by zero

没有发生异常的执行情况(执行完try块后,执行else):

请输入被除数:10
请输入除数:5
除的结果是: 2.0

三 finally结构和return语句位置

3.1 try…except…finally结构

image-20211122185431684

try...except...finally结构中,finally块无论是否发生异常都会被执行;通常用来释放try块中申请的资源。

【示例】try...except...finally结构简单测试

try:
  a = input("请输入一个被除数:")
  b = input("请输入一个除数:")
  c = float(a)/float(b)
except BaseException as e:
  print(e)
else:
  print(c)
finally:
  print("我是finally中的语句,无论发生异常与否,都执行!")print("程序结束!")

执行结果如下:

请输入被除数:10
请输入除数:0
float division by zero
我是finally中的语句,无论是否发生异常都执行

【示例】读取文件,finally中保证关闭文件资源

try:
  f = open("d:/a.txt",'r')
  content = f.readline()
  print(content)
except BaseException as e:
  print(e)
finally:
  f.close()    #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行print("step4")

发生异常的执行结果:

Traceback (most recent call last):
[Errno 2] No such file or directory: 'd:/a.txt'
 File "...mypro_exception/my01.py", line 8, in <module>
  f.close()    #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行
NameError: name 'f' is not defined
​
Process finished with exit code 1

3.2 return语句和异常处理问题

由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后。

【示例】return和异常结构的正确处理方式

def test01():
  print("step1")
  try:
    x = 3/0
    # return "a"
  except:
    print("step2")
    print("异常:0不能做除数")
    #return "b"
  finally:
    print("step4")
    #return "d"print("step5")
  return "e"     #一般不要将return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())

执行结果:

step1
step2
异常:0不能做除数
step4
step5
e

四 常见异常汇总说明

image-20211122185542700

Python中的异常都派生自BaseException类,本节我们测试和列出常见的一些异常,方便初学者掌握。

4.1 常见异常的解决

  1. SyntaxError:语法错误
  int a =3 
    ^
SyntaxError: invalid syntax

  1. NameError:尝试访问一个没有申明的变量
  print(a)
NameError: name 'a' is not defined

  1. ZeroDivisionError:除数为0错误(零除错误)
  a = 3/0
ZeroDivisionError: division by zero

  1. ValueError:数值错误
  float("gaoqi")
ValueError: could not convert string to float: 'gaoqi'

  1. TypeError:类型错误
  123+"abc"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

  1. AttributeError:访问对象的不存在的属性
a=100
a.sayhi()
​
AttributeError: 'int' object has no attribute 'sayhi'

  1. IndexError:索引越界异常
a = [4,5,6]
a[10]
​
IndexError: list index out of range

  1. KeyError:字典的关键字不存在
a = {'name':"gaoqi",'age':18}
a['salary']
​
KeyError: 'salary'

4.2 常见异常汇总

建议大家通读,把异常相关的单词背下来熟悉一下。这样可以克服“畏难情绪”。

异常名称说明
ArithmeticError所有数值计算错误的基类
AssertionError断言语句失败
AttributeError对象没有这个属性
BaseException所有异常的基类
DeprecationWarning关于被弃用的特征的警告
EnvironmentError操作系统错误的基类
EOFError没有内建输入,到达EOF 标记
Exception常规错误的基类
FloatingPointError浮点计算错误
FutureWarning关于构造将来语义会有改变的警告
GeneratorExit生成器(generator)发生异常来通知退出
ImportError导入模块/对象失败
IndentationError缩进错误
IndexError序列中没有此索引(index)
IOError输入/输出操作失败
KeyboardInterrupt用户中断执行(通常是输入^C)
KeyError映射中没有这个键
LookupError无效数据查询的基类
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
NotImplementedError尚未实现的方法
OSError操作系统错误
OverflowError数值运算超出最大限制
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
StandardError所有的内建标准异常的基类
StopIteration迭代器没有更多的值
SyntaxErrorPython 语法错误
SyntaxWarning可疑的语法的警告
SystemError一般的解释器系统错误
SystemExit解释器请求退出
TabErrorTab 和空格混用
TypeError对类型无效的操作
UnboundLocalError访问未初始化的本地变量
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeErrorUnicode 相关的错误
UnicodeTranslateErrorUnicode 转换时错误
UserWarning用户代码生成的警告
ValueError传入无效的参数
Warning警告的基类
WindowsError系统调用失败
ZeroDivisionError除(或取模)零 (所有数据类型)
deTranslateErrorUnicode 转换时错误
UserWarning用户代码生成的警告
ValueError传入无效的参数
Warning警告的基类
WindowsError系统调用失败
ZeroDivisionError除(或取模)零 (所有数据类型)
  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于Python项目的结构,没有一个固定的标准,但是有一些常见的组织方式可以参考。下面是一个比较常见Python项目结构: ``` project/ │ ├── src/ │ ├── __init__.py │ ├── module1.py │ ├── module2.py │ └── ... │ ├── tests/ │ ├── __init__.py │ ├── test_module1.py │ ├── test_module2.py │ └── ... │ ├── docs/ │ ├── conf.py │ ├── index.rst │ ├── ... │ └── _static/ │ ├── setup.py ├── requirements.txt └── README.md ``` 其中,`src/` 目录存放项目的源代码,`tests/` 目录存放项目的测试代码,`docs/` 目录存放项目的文档,`setup.py` 是项目的安装脚本,`requirements.txt` 是项目的依赖列表,`README.md` 是项目的说明文件。 在 `src/` 目录下,可以根据项目的功能将代码分为不同的模块,每个模块放在一个单独的 `.py` 文件中,同时需要在 `__init__.py` 文件中导入这些模块以便其他代码可以使用。 在 `tests/` 目录下,可以编写测试代码,一般使用 Python 的测试框架(如 unittest、pytest 等)进行测试。 在 `docs/` 目录下,可以编写项目的文档,一般使用 reStructuredText 或 Markdown 格式,使用 Sphinx 工具生成 HTML 或 PDF 格式的文档。 最后,在项目根目录下,需要编写 `setup.py` 文件以便其他人可以安装和使用你的项目。在 `requirements.txt` 文件中列出项目的依赖,以便其他人可以通过 `pip` 安装这些依赖。 以上是一个常见Python项目结构,但实际上可以根据项目的具体情况进行调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

留不住的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值