异常捕获

异常捕获

当你的程序出现例外情况时就会发生异常(Exception)。例如,当你想要读取一个文件时,而那个文件却不存在,怎么办?又或者你在程序执报错了怎么办?这些通过使用异常来进行处理。类似地,如果你的程序中出现了一些无效的语句该怎么办?python 将会对此进行处理,举起(Raises)它的小手来告诉你哪里出现了一个错误(Error)。

当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try...except...结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有

关键字 关键字说明
try/except 捕获异常并处理
pass 忽略异常
as 定义异常实例(except MyError as e)
else 如果try中的语句没有引发异常,则执行else中的语句
finally 无论是否出现异常,都执行的代码
raise 抛出/引发异常

try捕获到异常后,将不往下执行

异常捕获

预判在某一个位置可能会出现异常的时候,将这个错误捕获出来

try:				#捕获对象
	被捕获子语句
except 异常类型:	#捕获报错
	操作语句

捕获所有异常

包含键盘中断和程序退出请求,慎用

try:
     <语句>
except:
     <语句>

案例

try:
    import sys
    sys.exit()
except:
    print("999")

捕获指定异常

try:
     <语句>
 
except <异常名>:
 
      print('异常说明')
try:
    print("name-1")
    name
    print("name-2")
except NameError:
    print("格式错误")

万能异常捕获,捕获所有异常

try:
     <语句>
 
except Exception:
 
      print('异常说明')
try:
    f = open("file-not-exists", "r")
except Exception:
    print("错误类型")

捕获多个异常

捕获多个异常有两种方式,

第一种是except同时处理多个异常,不区分优先级:

try:
     <语句>
 
except (<异常名1>, <异常名2>, ...):
 
      print('异常说明')

第二种是区分优先级的:

try:
     <语句>
 
except <异常名1>:
 
      print('异常说明1')
 
except <异常名2>:
 
      print('异常说明2')
 
except <异常名3>:
 
      print('异常说明3')

该种异常处理语法规则是:

  • 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
  • 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
  • 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
  • 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

异常中的else

如果判断完没有某些异常之后还想做其他事,就可以使用下面这样的else语句。

try:
     <语句>
 
except <异常名1>:
 
      print('异常说明1')
 
except <异常名2>:
 
      print('异常说明2')
 
else:
 
      <语句>  # try语句中没有异常则执行此段代码

使用else字句把所有的语句都放在try字句里面要好,这样可以避免一些意想不到,而except又无法捕获的异常。

异常中的finally

try..finally...语句无论是否发生异常都将会执行的最后的代码

     <语句>

raise主动触发异常

可以使用raise语句自己触发异常,raise语法格式

raise [Exception [, args [, traceback]]]

函数实现两个数值的除法计算

"""
函数实现两个数值的除法计算*
"""

def division(a,b):
    num = a / b
    return num

try:
    bcf = int(input("输入被除数:"))
    cf = int(input("输入除数:"))

    endnum = division(bcf,cf)
    print(endnum)
except ZeroDivisionError:
    print("除数不能为0")

except ValueError:
    print("输入一个整数")
except EOFError:
    pass

except KeyboardInterrupt:
    pass

常见异常类型

异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt
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
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 用户代码生成的警告
posted @ 2024-10-31 14:25  帅帅啊  阅读(26)  评论(0)    收藏  举报