python除数不能为零的报错_⼗七、深⼊Python异常处理
「@Author:BY Runsen」
在Python 中的错误和异常是什么?
通常来说,程序中的错误⾄少包括两种,⼀种是语法错误,另⼀种则是异常。
语法错误
所谓语法错误,你应该很清楚,也就是你写的代码不符合编程规范,⽆法被识别与执⾏,⽐如下⾯这个例⼦的语法错误
下⾯的代码⽆法被识别和执⾏
if name is not None
print(name)
上⾯的代码If 语句漏掉了冒号,不符合 Python 的语法规范,所以程序就会报错invalid syntax。
异常
异常则是指程序的语法正确,也可以被执⾏,但在执⾏过程中遇到了错误,抛出了异常。
⽐如,最常见的除数不能为0。变量没有定义。数据类型的运算。
10 / 0
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero
order * 2
Traceback (most recent call last):
File "", line 1, in
NameError: name 'order' is not defined1 + [1, 2]
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'list'
上⾯报的是常见的报错,⽐如ZeroDIvision NameError 和 typeError
还有很多其他异常的类型如keyError 字典的键不到和FileNotFoundError ⽂件不存在
try except
使⽤Python的异常处理语句,可以⾮常优雅地处理发⽣的异常。
下⾯是Python的异常处理语句的模板语法
try:
# 可能触发异常的语句块
except:
# 这⾥执⾏异常处理的相关代码,打印输出等
else:
# 如果没有异常则执⾏else中的代码
finally:
# 不管代码是否异常,都会执⾏,⼀般是资源的关闭和释放
⾸先,检测try语句块中的错误,except语句捕获异常信息并处理。如果在try⼦句执⾏时没有发⽣异常,Python将执⾏else语句后的语句,然后控制流通过整个try语句。
⽐如看下⾯的例⼦。
try:
print(a*2)
except TypeError:
print("TypeError")
except:
print("Not Type Error & Error noted")
Not Type Error & Error noted
由于a没有定义,报的是NameError⽽不是TypeError。异常最终被except:部分的程序捕捉。
这⾥,Runsen补充⼀下⾮常重要的知识点:
抛出异常
抛出异常模板:raise 异常类名(附加异常信息) 。下⾯是⽰例代码:
s = "RunsenRunsen"
try:
if len(s) > 10:
raise Exception("超过10个字符")
except Exception as err:
print(err)
超过10个字符
有时产⽣的异常,不想在当前处理,那么就可以使⽤raise抛出异常。下⾯是⽰例代码:
def division():
a = float(input('输⼊被除数:'))
b = float(input("输⼊除数:"))
if a        raise Exception("我是Runsen,要求:输⼊的数不能⼩于0。") #出现负数抛出异常。
c = a / b
print(a,'÷',b,'=',c)
try:
division()
except Exception as d:
print('出错了,',d)
运⾏结果:
输⼊被除数:5
输⼊除数:-1
出错了,我是⼩学⽣,输⼊的数不能⼩于0。
输⼊被除数:5
输⼊除数:0
出错了, float division by zero
万能异常
因为异常分了不同的种类,如果不知道,那么使⽤exception异常处理就⾜够了,它可以接收任何异常
value = 'hello'
try:
int(value)
#万能异常处理
except Exception as e:
print(e)
⾃定义异常
实际开发中,有时候系统提供的异常类型不能满⾜开发的需求。这时候你可以通过创建⼀个新的异常类来拥有⾃⼰的异常。异常类继承⾃Exception 类,可以直接继承,或者间接继承。
# ⾃定义异常类 MyError ,继承普通异常基类 Exception
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
num = input("请输⼊数字:")
if not num.isdigit():  # 判断输⼊的是否是数字
raise MyError(num)  # 输⼊的如果不是数字,⼿动指定抛出异常
except MyError as e:
print("MyError:请输⼊数字。您输⼊的是:", e.value)
请输⼊数字:1
请输⼊数字:Runsen
MyError:请输⼊数字。您输⼊的是:Runsen
扩展
⼤型社交⽹站的后台,需要针对⽤户发送的请求返回相应记录。⽤户记录往往储存在 key-value 结构的数据库中,每次有请求过来后,我们拿到⽤户的 ID,并⽤ ID 查询数据库中此⼈的记录,就能返回相应的结果。⽽数据库返回的原始数据,往往是 json string 的形式,这就需要我们⾸先对 json string 进⾏ decode(解码),你可能很容易想到下⾯的⽅法:
import json
raw_data = queryDB(uid) # 根据⽤户的 id,返回相应的信息。queryDB这⾥是⼀个函数
data = json.loads(raw_data)
上⾯的代码是不是就⾜够呢?
json.loads()函数中,如果输⼊的字符串不符合规范,那么就⽆法解码,就会抛出异常。
raw_data⼀定是json吗?,因此写之前就应该考虑如何处理异常
try:
data = json.loads(raw_data)
except JSONDecodeError as err:
print('JSONDecodeError: {}'.format(err))
「附件:异常类列表(来源:菜鸟教程)」
异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
菜鸟教程python函数
KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit⽣成器(generator)发⽣异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最⼤限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断⾔语句失败
AttributeError对象没有这个属性
EOFError没有内建输⼊,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输⼊/输出操作失败
OSError操作系统错误
WindowsError系统调⽤失败
ImportError导⼊模块/对象失败
LookupError⽆效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引⽤(Weak reference)试图访问已经垃圾回收了的对象RuntimeError⼀般的运⾏时错误
NotImplementedError尚未实现的⽅法
SyntaxError Python 语法错误
IndentationError缩进错误
TabError Tab 和空格混⽤
SystemError⼀般的解释器系统错误
TypeError对类型⽆效的操作
ValueError传⼊⽆效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃⽤的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于⾃动提升为长整型(long)的警告PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运⾏时⾏为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning⽤户代码⽣成的警告
本⽂已收录 GitHub,传送门~[1] ,⾥⾯更有⼤⼚⾯试完整考点,欢迎 Star。
Reference
[1]
今天的⽂章到这⾥就结束了,如果喜欢本⽂的话,请来⼀波素质三连,给我⼀点⽀持吧(关注、在看、点赞)。更多的⽂章
点击下⾯⼩程序

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。