第二十章 异常处理

一、什么是异常

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下:


千锋云计算杨哥团队

而错误分成以下两种情况

1. 语法错误

#语法错误一
if
#语法错误二
def test:
    pass
#语法错误三
class Foo
    pass
#语法错误四
print(haha

2. 非语法错误

# TypeError:int类型不可迭代
for i in 3:
    pass

# ValueError
inp=input(">>: ") # 输入 qf
int(inp)

# NameError
aaa

# IndexError
l=['yangge','aa']
l[3]

# KeyError
dic={'name':'yangge'}
dic['age']

# AttributeError
class Foo:
    pass
Foo.x

# ZeroDivisionError:无法完成计算
res1=1/0


二、异常的种类

在python中不同的异常可以用不同的类型(python3中统一了类与类型,类型即类)去标识,一个异常标识一种错误

# 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
AttributeError 

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

# 无法导入模块或包;基本上是路径问题或名称错误
ImportError 

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

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

# 试图访问字典里不存在的键
KeyError 

#  按了一下 Ctrl+C
KeyboardInterrupt

# 使用一个还未被赋予对象的变量
NameError 

# 无效语法,语法错误
SyntaxError 

# 传入对象类型不符合要求,如sum 函数需要的是 int,但你传入了 str
TypeError 

# 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
UnboundLocalError 
# 例如:
"""
x = 1
def func():
    x += 1
    return x

func()

UnboundLocalError: local variable 'x' referenced before assignment
# 局部变量 x 在赋值之前被引用
"""

# 传入一个调用者不期望的值,即使值的类型是正确的,比如 int('a')
ValueError 


三、异常处理

为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,

如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

基本语法为

try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑

例子

def func(arg):
    try:
        arg +=1
    except TypeError as e:
        print(e)

func('杨哥')

1. 使用正确的异常类型

异常处理,只可以捕获到声明的异常种类和发生异常的种类相匹配的情况。
假如发生的异常类型和你指定捕获到异常不能匹配,就无法处理。

x = '杨哥'
try:
    int(x)
except IndexError as e: # 未捕获到异常,程序直接报错
    print(e)

2. 处理异常的多分支操作

x = '杨哥'
try:
    int(x)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

3. 万能异常 Exception

x = '杨哥'
try:
    int(x)
except Exception as e:
    print(e)

6. 异常的其他结构

x = '杨哥'
try:
    int(x)
except Exception as e:
    print(e) 
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')


四、更详细的异常信息输出(生产环境必备)

import traceback

print('start-->')
try:
    1 + 'a'
except TypeError as e:
    print(e)
    print('*' * 30)
    print(traceback.format_exc())
    print('*' * 20)

print('end')
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 6,265评论 0赞 9
  • 《Java从小白到大牛》纸质版已经上架了!!! 很多事件并非总是按照人们自己设计意愿顺利发展的,而是有能够出现这样...
    tony关东升阅读 976评论 0赞 1
  • 什么是异常? 异常本质上是程序上的错误,错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。 编译...
    若兮缘阅读 3,890评论 0赞 11
  • 一、概要 ​ 一个程序即使没有任何语法错误,即使解题的逻辑也正确,在执行的时候仍然可能出现 各种“运行时错误”,导...
    唯老阅读 553评论 0赞 1
  • 八、深入理解java异常处理机制 引子try…catch…finally恐怕是大家再熟悉不过的语句了, 你的答案是...
    壹点零阅读 1,784评论 0赞 0

友情链接更多精彩内容