python 基础 day11 异常处理

常见异常类型

  1. AssertionError:当 assert 关键字后的条件为假时,程序运行会停止并抛出 AssertionError 异常
  2. AttributeError:当试图访问的对象属性不存在时抛出的异常
  3. IndexError:索引超出序列范围会引发此异常
  4. KeyError:字典中查找一个不存在的关键字时引发此异常
  5. NameError:尝试访问一个未声明的变量时,引发此异常
  6. OSError:操作系统产生的错误
  7. SyntaxError:Python的语法错误
  8. TypeError:不同类型数据之间的无效操作
  9. ZeroDivisionError:除法运算中除数为 0 引发此异常

try except异常处理

Python 提供了try except语句捕获并处理异常,该异常处理语句的基本语法结构如下:

    try:
          可能产生异常的代码块
    except [(Error1, Error2, ...) [as reason]]:
          处理异常的代码块1
    except [(Error3, Error4, ...) [as reason]]:
          处理异常的代码块2

(Error1,Error2,…) 、(Error3,Error4,…) 表示各自的 except 块可以处理异常的具体类型;[as reason] 表示将异常类型赋值给变量 reason(方便在 except 块中调用异常类型)。

注意,except 后面也可以不指定具体的异常名称,这样的话,表示要捕获所有类型的异常。

try 块仅有一个,但 except 代码块可以有多个,这是为了针对不同的异常类型提供不同的异常处理方式

try-except处理的流程:

  1. 首先执行 try 中的代码块,如果执行过程中出现异常,系统会自动生成一个异常对象,该异常对象会提交给 Python解释器,此过程被称为引发异常。
  2. 当 Python 解释器收到异常对象时,会寻找能处理该异常对象的 except 块,如果找到合适的 except块,则把该异常对象交给该 except 块处理,这个过程被称为捕获异常。如果 Python 解释器找不到捕获异常的 except块,则程序运行终止,Python 解释器也将退出。
try:
    f=open("ad.txt")
    print(f.read())
    f.close()
except IndexError as reason:
    print(str(reason))
except OSError as reason:
    print(str(reason))
#[Errno 2] No such file or directory: 'ad.txt'

多个异常也可做统一处理

注意try语句一旦出现异常,剩下语句将不被执行

try except else

try except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。

try:
    f=open("ad.txt",'w')
    f.write("There is no error")
    f.close()
except IndexError as reason:
    print(str(reason))
except OSError as reason:
    print(str(reason))
else:
    print("没有错误")
    
    #没有错误

try except finally

无论 try 中的语句是否跳入 except 中,最终都要进入 finally 语句,并执行其中的代码块。
在这里插入图片描述
在异常处理语法结构中,只有 try 块是必需的,也就是说:

  • 如果没有 try 块,则不能有后面的 except 块和 finally 块;
  • except 块和 finally 块都是可选的,但 except 块和 finally 块至少出现其中之一,也可以同时出现;
  • 可以有多个 except 块,但捕获父类异常的 except 块应该位于捕获子类异常的 except 块的后面;
  • 不能只有 try 块,既没有 except 块,也没有 finally 块;
  • 多个 except 块必须位于 try 块之后,finally 块必须位于所有的 except 块之后

finally 语句块和 else 语句块的区别是,else 语句块只有在没有异常发生的情况下才会执行,而 finally 语句则不管异常是否发生都会执行。不仅如此,无论是正常退出、异常退出,还是通过 break、continue、return 语句退出,finally 语句块都会执行。

try:
    f = open("ad.txt")
    f.write("There is no error")
    f.close()
except IndexError as reason:
    print(str(reason))
except OSError as reason:
    print(str(reason))
else:
    print("没有错误")
finally:
    print("运行结束")
#not writable
#运行结束

raise语句

Python 使用 raise 语句抛出一个指定的异常。

raise NameError()#NameError
raise NameError('HiThere')#NameError: HiThere
发布了47 篇原创文章 · 获赞 5 · 访问量 1933

猜你喜欢

转载自blog.csdn.net/Pang_ling/article/details/102817287