【学习笔记】python异常

异常

举例:什么是异常?

a
Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘a’ is not defined

当异常出现的时候,且没有做任何处理,程序不会继续执行,也就是说程序被中断了。
异常的出现是不好的,未处理异常会中断,程序就退出。
服务器端程序,出现异常没有捕获,程序就中断了。服务器死掉了,网页就会500。

异常信息的作用:

会显示出错的代码行号
异常类型:加具体的信息说明
养成习惯:

  1. 把异常的信息搞明白什么意思
  2. 出错的代码在哪一行,具体的代码是啥,具体分析

为什么会出现异常

1. 程序出错。例1/0,变量没定义
2. 用户输入的数据问题
3. 运行中,性能问题,内存泄漏,句柄泄漏

避免异常的方式:

try:
result = 1/0
print(“ok”)
except:
print(“出现了一些问题”)
print(“Done!”)

写程序的原则:

  1. 程序不能崩溃哭
  2. 能够提示用户或者程序员明确的信息

小练习:

使用try except写一个异常处理的例子。拦截不同的异常,并给出具体的错误信息

try:
s
result = 1/0
print(“ok”)
except ZeroDivisionError:
print(“出现除0操作了!”)
except NameError:
print(“变量没定义!”)
print(“Done!”)

#try里面的代码产生的多个异常,只会有要I 个被抛出
#异常信息,只会被拦截一次

例:

def div(a,b):
if not(isinstance(a,(int,float))and \isinstance(b,(int,float)):
print(“不全是数字”)
try:
result = a/b
except TypeError:
print(“出现了类型不匹配的情况”)
except ZeroDivsionError:
print(“被除数为零的异常出现了”)
print(div(2,1))
print(div(1,“x”))
print(div(1,0))

堆栈信息

def a():
print(“a”)
b()

def b():
print(“a”)
c()

def c():
print(“a”)
d()

def d():
print(“1/0”)

a()

面试题:如何判断一个字符串是json 串:s = “{1:’a’}”
  1. 基于格式的规则做判断,是个误区
  2. json串和字典的转换

import json
d={1:‘a’}
s=json.dumps{d} #将字典转换成json串
print(s)
d=json.loads(s) #将json串转换回字典
print(type(d))

  1. 技巧:用try,只要能转换成字典不出错,就是个json串
    答:

import json
d=‘xxxxxxx’
try:
d=json.load(d)
except:
print(“不是一个合格的json串类型”)

异常捕获的应用场景:

  1. 可能程序出错的地方
  2. 异常处理用户可能输入的错误数据
  3. 异常处理可能出现的系统(IO)的错误
  4. 异常处理可能出现的网络的错误

import json
try:
1/0 # 可能出现的各种错误
except ZeroDivisionError:
print(“除0的错误出现了”)
except: # except必须在最后
print(“有位置错误”)

打印错误信息:except Error as e:

import json
try:
1/0
except ZeroDivisionError as e:
print(“除0的错误出现了”)
print(e) #没有错误行号和堆栈信息
print(traceback.print_exc()) #调用的堆栈信息显示
except:
print(“有位置错误”)
print(“ok!”)

else的使用

当没有出现任何异常的时候执行else,例:

try:
1/1
except ZeroDivisionError as e:
print(“除0的错误出现了”)
print(e)
except:
print(“有位置错误”)
print(“ok!”)
else:
print(“没有出现错误”)

总结:else在try执行完所有内部的代码后,没有异常的情况下才会被执行。有异常,则不会被执行。

Final的使用:

例如:

try:
1/1
except ZeroDivisionError as e:
print(“除0的错误出现了”)
print(e)
except:
print(“有位置错误”)
print(“ok!”)
else:
print(“没有出现错误”)
finally:
print(“无论如何我都会被执行”)

总结:finally一般会使用在数据库连接中,最后都会释放一下最后的资源。

抛出异常:raise

例如:

try:
raise NameError
except ZeroDivisionError as e:
print(“除0的错误出现了”)
print(e)
except NameError:
print(“Nameerror异常”)
else:
print(“没有出现错误”)
finally:
print(“无论如何我都会被执行”)

场景:程序符合语法,但是不符合业务规则,所以要抛出异常。让其他程序再去做处理。

注意事项:

  1. try不能单独存在
  2. try是可以嵌套的
    例如:

try:
1/1
try:
1/0
except:
raise
except:
print(“未知错误”)

异常信息总结

NameError: name ‘a’ is not defined

变量没有被定义,Python里若定义一个变量只有赋值。例如:

a=1
print(a)
1

所以遇到这个报错,第一反应是没有赋值,二是变量名打错了

IndexError: list index out of range

索引错误,第一反应索引值超出了范围,看一下列表长度是多少。例如:

a=list(range(5))
a
[1,2,3,4,5]
A[10]

第二是改小index的值

TypeError: “list” object is not callable

Xxx对象不能被调用。例如:

list=1
list(“abc”)
Traceback (most recent call last):
File “”, line 1, in
TypeError: ‘int’ object is not callable

出错原因:把保留字当成了一个变量,保留字不能作为变量

TypeError: ord() expected string of length 1, but int found

没有加引号,例如:

ord(0)
Traceback (most recent call last):
File “”, line 1, in
TypeError: ord() expected string of length 1, but int found

IndexError: string index out of range

越界

s=“gloryroad is good!”
len(s)
18

s[20]

Traceback (most recent call last):

File “”, line 1, in
IndexError: string index out of range

TypeError: ‘int’ object is not callable

非函数类型,当函数调用了

10()
Traceback (most recent call last):
File “”, line 1, in
TypeError: ‘int’ object is not callable

你可能感兴趣的:(Python)