07-Python异常处理

什么是异常?

Python无法正常处理程序时就会发生一个异常,这时Python就会抛出一个对象,表示这是一个错误。

必须处理异常,否则程序可能会停止运行,或者出现异常现象。

:4/0就会抛出异常,因为除数不可以为0。
:a=[1,2,3],访问a[10]就会抛出异常,因为下标超出了范围(0~2)。

示例:

a=[1,2,3]
print(a[10])

抛出异常:

在这里插入图片描述


常见异常

ImportError           # 引入模块错误,大部分是路径问题或名称错误。
ModuleNotFoundError   # 模块不存在
IOError               # 输入输出异常,大部分是无法打开文件
FileNotFoundError     # 文件不存在
KeyError              # 访问字典里不存在的键
ZeroDivisionError     # 除(或取模)零
NameError             # 变量未定义
TypeError             # 实参的类型与要求的不符(如time.sleep("1"))
ValueError            # 实参的值与要求的不符,即使类型正确(如int("one"))
IndexError            # 下标越界

小贴士:

Python中存在许许多多的异常,具体情况具体处理。


捕获并处理异常

程序抛出异常后,可能会停止运行。因为程序毕竟是程序,不够智能,并不会处理它们。

程序会根据不同的情况,抛出不同的异常。

需要捕获相应的异常并进行处理,程序才会正常的运行下去。

综上所述,提前用代码告知Pyton,出现各种异常该如何处理。

try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print("文件打开失败:",fileNotFoundError)
except:             #其他错误
    print("其他错误")

解释:

  • 在try语句块中执行可能发生错误的代码
  • 使用except来捕获异常
  • FileNotFoundError是异常名,表示文件不存在
  • fileNotFoundError为对象名,可自定义,通过此对象来处理异常
  • 当文件不存在,异常就会被fileNotFoundError捕获
  • 出现其他错误,就会输出:其他错误

手动抛出异常

手动抛出异常,再捕获异常,进行处理。
如:需要用户输入数字,用户却输入了字符

age=input("请输入年龄:")
if not age.isdigit():
    raise ValueError("值错误")

若发生异常:

在这里插入图片描述

若没有发生异常:

在这里插入图片描述

解释:

  • 使用关键字raise抛出异常
  • 抛出异常ValueError
  • 上例没有对异常进行捕获处理,只是抛出。
  • 有些异常发生时,程序不会停止运行,如ValueError(退出码为0)
手动抛出异常,并捕获、处理异常:
try:
    age=input("请输入年龄:")
    if not age.isdigit():
        raise ValueError("值错误")
except ValueError as valueError:
    print(valueError)
    exit(1)

若发生异常:

在这里插入图片描述

若没有发生异常:

在这里插入图片描述


自定义异常

  • 所有的异常都是Exception或Exception的子类
  • 继承Exception,成为它的子类,即为自定义异常。
class MyError(Exception):       #继承了Exception
    def __init__(self,value):   #构造函数
        	self.value=value
    def __str__(self):          #强制转换
       	return str(self.value)
try:
    raise MyError("我的错误")    #抛出异常
except MyError as myError:      #捕获异常
    print(myError)                #处理异常

try-else

  • 当try块中没有发生异常,就会执行else语句块
try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print(fileNotFoundError)
else:
    print("没有发生错误")

try-finally

  • 无论是否发生异常都将执行finally语句块
try:
    f=open("hello.txt","r")
except FileNotFoundError as fileNotFoundError:
    print(fileNotFoundError)
finally:
    print("无论是否异常,都会输出")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章