zoukankan      html  css  js  c++  java
  • python异常处理

    知识内容:

    1.异常与异常处理

    2.python中的异常处理结构

    3.断言与上下文管理

    一、异常与异常处理

    1.异常

    简单的说异常是程序运行时引发的错误,引发错误的原因有很多,例如除0、下标越界、文件不存在等,这些错误如果不得到正确处理将会导致程序终止运行,而合理地使用异常结构可以使程序更加健壮,具有更好地容错性,另外在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是给出一个提示的页面

    简单定义: 异常就是程序运行时发生错误的信号,如果不处理程序就会停止并报出这个信号

    实例如下图

    常见的异常如下:

     1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
     2 IOError 输入/输出异常;基本上是无法打开文件
     3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
     4 IndentationError 语法错误(的子类) ;代码没有正确对齐
     5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
     6 KeyError 试图访问字典里不存在的键
     7 KeyboardInterrupt Ctrl+C被按下
     8 NameError 使用一个还未被赋予对象的变量
     9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    10 TypeError 传入对象类型与要求的不符合
    11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    12 导致你以为正在访问它
    13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的

    2.异常处理

    为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,这就是异常处理

    异常处理的方法:

    (1)在程序中判断处理

    1 a, b = input("计算除法,输入两个数: ").strip().split()
    2 
    3 if int(b) == 0:
    4     print("第二个数不能为0!")
    5     exit()
    6 
    7 a, b = int(a), int(b)
    8 print("%d/%d=%.2f" % (a, b, a/b))

    (2)使用python中的异常处理结构

    1 try:
    2     被检测的代码块
    3 except 异常类型:
    4     try中一旦检测到异常,就执行这个位置的逻辑

    代码如下

    1 try:
    2     a, b = input("计算除法,输入两个数: ").strip().split()
    3     a, b = int(a), int(b)
    4     print("%d/%d=%.2f" % (a, b, a/b))
    5 
    6 except ZeroDivisionError:
    7     print("除数不能为0!")

    二、python中的异常处理结构

    1.try...except结构

     1 try:
     2     代码      # 被监控的语句,可能会发生异常
     3 except 异常名:
     4     代码      # 处理异常的代码
     5 
     6 # 捕获所有类型的异常
     7 try:
     8     代码      # 被监控的语句,可能会发生异常
     9 except Exception [as reason]:
    10     代码      # 处理异常的代码

    2.try...except...else结构

    1 try:
    2     代码      # 被监控的语句,可能会发生异常
    3 except 异常名:
    4     代码      # 处理异常的代码
    5 else:
    6     代码      # 捕获了异常就不执行,否则就执行

    3.try...except...finally结构

    1 try:
    2     代码      # 被监控的语句,可能会发生异常
    3 except 异常名:
    4     代码      # 处理异常的代码
    5 finally:
    6     代码      # 无论如何都会执行

    异常处理实例:

     1 try:
     2     mylist = [4, 6]
     3     print(mylist[10])
     4     print("This is never been called")
     5 
     6 except ZeroDivisionError as e:    # 异常ZeroDivisionError被捕获执行以下代码
     7     print("ZeroDivisionError happened")
     8     print(e)
     9 
    10 except (IndexError, EOFError) as e:  # 异常IndexError, EOFError被捕获执行以下代码
    11     print("Exception happened")
    12     print(e)
    13 
    14 except ...:         # 其他异常被捕获执行以下代码:
    15     print("Unknown exception happened")
    16 
    17 else:               # 没有出现异常时执行以下代码:
    18     print("There is no exception")
    19 
    20 finally:            # 无论是否出现异常都执行以下代码:
    21     print("Process finished!")

    三、断言与上下文管理

    断言与上下文管理是特殊的异常处理方式,在形式上比异常结构要简单一点,能够满足简单的异常处理或条件确认,并可以和标准的异常处理结构结合使用

    1.断言

    语法: assert expression [, reason]

    当expression为真时,什么都不做,为假时则抛出异常(reason)

    1 >>> try:
    2 ...     assert 1==2, "1 is not equal to 2"
    3 ... except AssertionError as reason:
    4 ...     print("%s:%s"%(reason.__class__.__name__, reason))
    5 ...
    6 AssertionError:1 is not equal to 2

    2.上下文管理

    使用上下文管理语句with可以自动管理资源,在代码块执行完毕后自动还原进入该代码块之前的现场或上下文

    另外不管以何种原因跳出with语句,也不论是否发生异常,总能保证资源被正常释放,大大简化了工作

    语法:

    with context_expr [as var]:

      代码块

    1 with open("test.txt") as f:
    2     for line in f:
    3         print(line)
  • 相关阅读:
    【FZYZOJ】数论课堂 题解(约数个数定理)
    【FZYZOJ】无向图的联通图个数 题解(组合数学)
    【BalticOI2003】Gem 题解(树形DP)
    中国剩余定理 学习笔记
    同余 学习笔记
    树形DP 学习笔记(树形DP、树的直径、树的重心)
    【USACO02FEB】Rebuilding Roads 重建道路 题解(树形DP)
    JavaSE 基础 第02节 搭建Java开发环境
    JavaSE 基础 第01节 Java语言介绍
    eclipse 调节字体大小
  • 原文地址:https://www.cnblogs.com/wyb666/p/8949248.html
Copyright © 2011-2022 走看看