python3 异常参数_python3之错误和异常

一、语法错误

程序运行过程出现的错误,包括语法上的错误和执行上的错误(通常是异常)

语法错误又称解析错误,可能是在学习Python时最容易遇到的错误

Python解析器会打印出错误的行,并在错误行中错误位置显示一个下标箭头

二、异常

语句或表达式在语法上是正确的,执行时引发错误称为异常

异常不一定会导致严重后果,大多数的异常都不会被程序处理,程序终止并显示异常错误信息

1 内置异常层次结构

BaseException+--SystemExit+--KeyboardInterrupt+--GeneratorExit+--Exception+--StopIteration+--StopAsyncIteration+--ArithmeticError| +--FloatingPointError| +--OverflowError| +--ZeroDivisionError+--AssertionError+--AttributeError+--BufferError+--EOFError+--ImportError| +--ModuleNotFoundError+--LookupError| +--IndexError| +--KeyError+--MemoryError+--NameError| +--UnboundLocalError+--OSError| +--BlockingIOError| +--ChildProcessError| +--ConnectionError| | +--BrokenPipeError| | +--ConnectionAbortedError| | +--ConnectionRefusedError| | +--ConnectionResetError| +--FileExistsError| +--FileNotFoundError| +--InterruptedError| +--IsADirectoryError| +--NotADirectoryError| +--PermissionError| +--ProcessLookupError| +--TimeoutError+--ReferenceError+--RuntimeError| +--NotImplementedError| +--RecursionError+--SyntaxError| +--IndentationError| +--TabError+--SystemError+--TypeError+--ValueError| +--UnicodeError| +--UnicodeDecodeError| +--UnicodeEncodeError| +--UnicodeTranslateError+--Warning+--DeprecationWarning+--PendingDeprecationWarning+--RuntimeWarning+--SyntaxWarning+--UserWarning+--FutureWarning+--ImportWarning+--UnicodeWarning+--BytesWarning+-- ResourceWarning

2 基类内置异常

BaseException

所有内置异常的基类,不能被用户定义的异常直接继承

Exception

所有内置的非系统退出异常都派生自此类,所有用户定义的异常也应从此类派生

ArithmeticError

所有算术类错误而引发的内置异常都派生自此类: OverflowError, ZeroDivisionError, FloatingPointError

BufferError

与缓冲区相关的操作无法执行时将被引发

LookupError

用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError

3 常用的具体内置异常

AssertionError

assert语句条件为False时引发

AttributeError

属性引用或赋值失败时引发

EOFError

当input()函数达到文件结束条件(EOF)而没有读取任何数据时引发

ImportError

当import语句导入模块失败时引发

ModuleNotFoundError

找不到模块时引发

IndexError

序列索引超出范围时引发

KeyError

找不到key时引发

KeyboardInterrupt

用户按下中断键(通常为Control-C或 Delete)时引发

MemoryError

内存不足时引发

NameError

使用未声明的变量时引发

StopIteration

内置函数next()和迭代器的__next__()方法,迭代器迭代完引发

SyntaxError

语法错误时引发

TabError

缩进混合使用空格和制表符时引发

TypeError

参数类型不支持当前操作时引发

ValueError

参数类型正确但值不合适时引发,即参数值无效

ZeroDivisionError

分母为0时引发

4 OSError异常的子类

BlockingIOError

将堵塞对象设置为费堵塞时引发

ChildProcessError

子进程上的操作失败时引发

ConnectionError

连接相关问题的基类

BrokenPipeError

ConnectionError的子类,在已关闭写入的套接字上写入

ConnectionAbortedError

ConnectionError的子类,连接尝试被对等方中止

ConnectionRefusedError

ConnectionError的子类,连接尝试被对等方拒绝

ConnectionResetError

ConnectionError的子类,连接由对等方重置

FileExistsError

创建文件或目录已存在时引发

FileNotFoundError

请求文件或目录不存在时引发

InterruptedError

系统调用被输入信号中断时引发

IsADirectoryError

在目录上请求文件操作时引发

NotADirectoryError

在非目录上请求目录操作时引发

PermissionError

没有访问权限时引发

ProcessLookupError

进程不存在时引发

TimeoutError

系统函数在系统级别超时时引发

三、异常捕捉处理

1 try...except

格式

try:

代码块except内置异常类型1:

发生异常时执行的代码块except内置异常类型2:

发生异常时执行的代码块

...exceptException:

...

其中

一个try语句可以有多个except语句,多个except语句处理不同的异常类型,但最多只会执行一个except语句

except后面异常类型可以有多个,以逗号隔开,如except (ValueError,IndexError.ArithmeticError)

多个except语句捕捉异常时的顺序: 应按子类异常在前,父类异常在后,即先小异常后大异常

示例

ef divisi_1(a,b):return int(a)/int(b)try:print(divisi_1('2',2))#引发ValueError错误

print(divisi_1('A',2))exceptValueError:print("参数值无效,数学运算只接受数字")exceptArithmeticError:print("算数错误")exceptException:print("未知错误")defdivisi_2(a,b):return int(a)/int(b)try:print(divisi_2('2',2))#引发ArithmeticError错误

print(divisi_2(2,0))exceptValueError:print("参数值无效,数学运算只接受数字")exceptArithmeticError:print("算数错误")exceptException:print("未知错误")

2 else块

当try块执行未出现异常时执行,else块可选

示例

defdivisi(a,b):return int(a)/int(b)try:print(divisi('2',2))exceptValueError:print("参数值无效,数学运算只接受数字")exceptArithmeticError:print("算数错误")exceptException:print("未知错误")else:print("try块未引发任何异常")

3 finally块

无论是否发生异常都被执行,常用于清理操作

以下情况需要注意

A.如果try块的异常没有被except块捕获,则该异常会在finally块执行之后被重新引发

B.如果except或else块引发异常, 则该异常会在finally块执行之后被重新引发

C.如果try块时有break, continue 或 return 语句,则finally块将在执行 break, continue 或 return语句之前被执行

D.如果finally 子句中包含一个 return 语句,则返回值将来自 finally 块的某个 return 语句的返回值,而非来自其它块的 return 语句返回值

示例

defdivisi(a,b):return int(a)/int(b)try:#引发ValueError错误

print(divisi('A',2))exceptValueError:print("参数值无效,数学运算只接受数字")exceptArithmeticError:print("算数错误")exceptException:print("未知错误")else:print("try块未引发任何异常")finally:print("始终执行的finally块")

4 完整的异常捕捉处理语法格式

格式

try:

代码块except内置异常类型1:

发生异常时执行的代码块except内置异常类型2:

发生异常时执行的代码块

...exceptException:

...else:

未发生异常的代码块finally:

清理操作代码块

其中

A.try块必须要有

B.except,finally块至少包含一个

C.else块可以没有

D.finally块必须在所有except块之后

E.多个except块,子类异常必须在父类异常之前

四、自行引发异常

除了系统自动引发异常,也可以自行引发异常

python对自行引发的异常和系统自动引发的异常同样的处理

示例

defcompare(a,b):if a > b:raise Exception("a不能大于b,a=%s,b=%s"%(a,b))else:print("%s>%s"%(b,a))try:

compare(5,4)exceptException as E:print(E.args)print("自行引发的Exception异常!")else:print("try块未引发任何异常!")finally:print("始终执行的finally块!")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值