一、错误
语法错误:使用 Pycharm 工具编写 Python 程序,编译器就会检测出来并给予提示,因此,编写好的程序几乎不会出现错误。
逻辑错误:编译器不会提示,例如:0作为被除数
二、异常
Python 程序语法正确,在运行时,有可能发生错误,运行期检测到的错误被称为异常;大多数的异常都不会被程序处理,会以错误信息的形式展现。
1、捕获所有异常
语法:
try:
可能发⽣错误的代码
except:
如果出现异常执⾏的代码
2、捕获指定异常
语法:
try:
可能发⽣错误的代码
except :
如果出现异常执⾏的代码
3、万能异常
语法:
try:
可能发⽣错误的代码
except Exception:
如果出现异常执⾏的代码
4、捕获多个异常
1)不区分优先级
语法:
try:
可能发⽣错误的代码
except (, , ...):
如果出现异常执⾏的代码
2)区分优先级
语法:
try:
可能发⽣错误的代码
except :
如果出现异常执⾏的代码1
except :
如果出现异常执⾏的代码2
except :
如果出现异常执⾏的代码3
该种异常处理语法的规则是:
执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
3)处理多个异常(没有捕获异常就执行else语句)
如果判断完没有某些异常之后还想做其他事,就可以使用else语句。
else 子句只能出现在所有 except 子句之后,只有在没有出现异常时执行。
语法:
try:
可能发⽣错误的代码
except :
如果出现异常执⾏的代码1
except :
如果出现异常执⾏的代码2
else:
 # try语句中没有异常则执行此段代码
5、无论是否检测到异常,都会执行finally代码
1)try_finally 无论是否检测到异常,都会执行finally代码,主要为异常处理事件提供清理机制,用来关闭文件或者释放系统资源。
语法:
try:
可能发⽣错误的代码
finally:
要执行此段代码
2)try-except-finally使用
1.若try语句没有捕获异常,执行完try代码段后,执行finally
2.若try捕获异常,首先执行except处理错误,然后执行finally
finally 子句放在最后,无论是否出现异常都会执行。
语法:
try:
可能发⽣错误的代码
except :
如果出现异常执⾏的代码1
finally:
要执行此段代码
3)try-except-else-finally使用
没有异常 try->else->finally
有异常 try->expect->finally
语法:
try:
可能发⽣错误的代码
except :
如果出现异常执⾏的代码
else:
 # try语句中没有异常则执行此段代码
finally:
要执行此段代码
6、raise主动触发异常
可以使用raise语句自己触发异常,raise语法格式如下:
raise [Exception [, args [, traceback]]]
使用 raise 语句允许强制抛出一个指定的异常,要抛出的异常由 raise 的唯一参数标识,它必需是一个异常实例或异常类(继承自 Exception 的类)。
示例:
def not_zero(num):
try:
if num == 0:
raise ValueError('参数错误')
return num
except Exception as e:
print(e)
not_zero(0)
7、采用traceback模块查看异常
语法:
try:
可能发⽣错误的代码
except:
traceback.print_exc()
示例:
try:
1/0
except Exception as e:
print(e)
这样就会帮我们追溯到出错点:
Traceback (most recent call last):
File "E:/workspaces/python/pythondemo/test/test2/异常.py", line 16, in 
1 / 0
ZeroDivisionError: division by zero
8、自定义异常
在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
示例:
# ⾃定义异常类,继承Exception
class ShortInputError(Exception):
def __init__(self, length, min_len):
self.length = length
self.min_len = min_len
# 设置抛出异常的描述信息
def __str__(self):
return f'你输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'
def main():
try:
con = input('请输⼊密码:')
if len(con) < 3:
raise ShortInputError(len(con), 3)
except Exception as result:
print(result)
else:
print('密码已经输⼊完成')
main()
输出结果:
请输⼊密码:2
你输⼊的⻓度是1, 不能少于3个字符
9、常见异常种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的