4.1 异常处理

4.1 异常处理

4.1.1 什么是异常

异常就是程序运行时发生错误的信号

iuerhfi

#输出
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

Cell In[1], line 1
----> 1 iuerhfi
NameError: name 'iuerhfi' is not defined

#解读
Traceback:异常的追踪信息
NameError:name 'iuerhfi' is not defined 
其中'NameError'是异常类,'name 'iuerhfi' is not defined'是异常值。
  • 举栗子
try:
    1/0
except:
    print('error')
    
#输出
error
  • (重点)Exception 万能异常(除了语法错误)
try:
    # 1/0
    dic=dict()
    dic['a']
    
except Exception as e:
    print(e) #打印异常
    
#语法错误无法通过try检测

以下仅为了解即可

1. 语法错误

在程序执行前发现并改正。
例如:符号丢失,关键字错误等。

#### 2. 逻辑错误

(1) TypeError: int类型不可迭代  

   for i in 2:
       pass

(2) ValueError  

x=input() #输入字符型  

int(x)

(3) NameError  

iuerhfi

(4)IndexError  

list=['a','b']  

list[3]

(5) KeyError  

dic={'name':'coco'}  

dic['age']


(6)AttributeError  

class A:pass  

A.x #属性错误

(7) ZeroDivisionError #无法完成计算  

n=1/0  

n=1+'dfg'

4.1.2 异常种类

在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误。

1. 常用异常

(1) AttributeError 试图访问一个对象没有的属性,比如A.x,但是A没有属性x

(2) IOError 输入/输出异常;基本上是无法打开文件

(3) ImportError 无法引入模块或包;基本上是路径问题或名称错误

(4) IndentationError 语法错误(的子类) ;代码没有正确对齐

(5) IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

(5) KeyError 试图访问字典里不存在的键

(7) KeyboardInterrupt Ctrl+C被按下

(8) NameError 使用一个还未被赋值的变量

(9) SyntaxError Python代码非法,代码不能编译

(10) TypeError 传入对象类型与要求的不符合

(11) UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

(12) ValueError 传入一个调用者不期望的值,即使值的类型是正确的

4.1.3 异常处理

保证程序的健壮性与容错性

  1. 提前预防
    错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

  2. 之后预防

#基本语法为
try:
    #被检测的代码块
except #异常类型 :
    # try中一旦检测到异常,就执行这个位置的逻辑
  Cell In[2], line 4
    except #异常类型 :
    ^
IndentationError: expected an indented block after 'try' statement on line 2

(1)异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

name = 'coco'
try:
    int(name)  #这是ValueError
except IndexError as e:  # 未捕获到异常,程序直接报错
    print(e)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

Cell In[1], line 3
      1 s1 = 'hello'
      2 try:
----> 3     int(s1)
      4 except IndexError as e:  # 未捕获到异常,程序直接报错
      5     print(e)


ValueError: invalid literal for int() with base 10: 'hello'

(2)多分支
对于不同的异常我们需要定制不同的处理逻辑

name = 'coco'
try:
    int(name)
except IndexError as e:
    print('IndexError:',e)
except KeyError as e:
    print('KeyError:',e)
except ValueError as e:
    print('ValueError:',e)
ValueError: invalid literal for int() with base 10: 'hello'

(3)万能异常Exception
无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理

name = 'coco'
try:
    int(name)
except Exception as e:
    print(e)
invalid literal for int() with base 10: 'hello'

(4)也可以在多分支后来一个Exception

name = 'coco'
try:
    int(name)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)
invalid literal for int() with base 10: 'hello'

(5)异常的最终执行

name='coco'
try:
    int(name)
    # f=open(filename)
except IndexError as e:
    print(e)
except KeyError as e :
    print(e)
except ValueError as e:
    print(e)
else :
    print('try代码块没有异常') #有异常则不执行
finally:
    print('无论是否有异常,都会执行该模块') #通常是清理工作
    # f.close() #用不到,都使用with open
invalid literal for int() with base 10: 'coco'
无论是否有异常,都会执行该模块
  • raise()主动抛出异常 & assert断言 (不推荐使用)
#raise
try:
    raise NameError('sigdfys')

except NameError as e:
    print(NameError)
#assert
assert 1==1 #执行
assert 1!=1 #报错,断言失败
---------------------------------------------------------------------------

AssertionError                            Traceback (most recent call last)

Cell In[1], line 3
      1 #assert
      2 assert 1==1 #执行
----> 3 assert 1!=1


AssertionError: 
x=10
y=x+10
assert y==20
posted @ 2025-08-08 10:28  bokebanla  阅读(11)  评论(0)    收藏  举报