python入门-Error / Exception 异常

209 阅读2分钟

捕获任意异常

try:
  1 / 0
except Exception as e:
  print(e)

## 捕获特定异常

def sand_box(cb):
  try:
    return cb()
  except ZeroDivisionError:
    print('除数不能为零')




def division_zero():
  return 1 / 0




def arr_out_index():
  return [1, 2][3]




sand_box(division_zero)
# -> 除数不能为零
sand_box(arr_out_index)
# -> IndexError: list index out of range

## 多错误类型

def sand_box(cb):
  try:
    return cb()
  except ZeroDivisionError:
    print('除数不能为零')
  except IndexError:
    print('数组越界')
  


def division_zero():
  return 1 / 0




def arr_out_index():
  return [1, 2][3]




sand_box(division_zero)
# -> 除数不能为零
sand_box(arr_out_index)
# -> 数组越界

## finally

def sand_box(cb):
  try:
    return cb()
  except Exception as e:
    print('获取异常', e)
  finally:
    print('结束') # 无论是否存在异常, 都将被执行
  


def division_zero():
  return 1 / 0


def division():
  return 1 / 1


sand_box(division_zero)
# -> 获取异常 division by zero
# -> 结束
sand_box(division)
# -> 结束

## 异常内返回

*   01执行函数内返回

def sand_box(cb):
  try:
    return cb()
  except Exception as e:
    print('获取异常', e)
  finally:
    print('结束')
  


def division_zero():
  return 1 / 0


def division():
  return 1 / 1


print(sand_box(division_zero))
print(sand_box(division))

获取异常 division by zero 结束 None 结束 1.0


*   异常捕获内返回

def sand_box(cb):
  try:
    return cb()
  except Exception as e:
    print('获取异常', e)
    return 'ERROR'
  finally:
    print('结束')
  


def division_zero():
  return 1 / 0


def division():
  return 1 / 1


print(sand_box(division_zero))
print(sand_box(division))

获取异常 division by zero 结束 ERROR 结束 1.0


*   finally 内返回

def sand_box(cb):
  try:
    return cb()
  except Exception as e:
    print('获取异常', e)
    return 'ERROR'
  finally:
    print('结束')
    return "END"
  


def division_zero():
  return 1 / 0


def division():
  return 1 / 1


print(sand_box(division_zero))
print(sand_box(division))
    ```
    获取异常 division by zero
    结束
    END
    结束
    END
    ```

如果 finally 内存在返回值,将覆盖异常处理内的返回值

异常抛出

def sand_box():
  try:
    raise Exception('这是条异常')
  except Exception as e:
    print('捕获异常: ', e)




sand_box()
# -> 捕获错误 这是条异常

## 自定义异常类

class Self_Exception(Exception):
  def __init__(self, msg, type) -> None:
    self.msg = msg
    self.type = type
      
  def __str__(self) -> str:
    return self.msg




def sand_box():
  try:
    raise Self_Exception('自定义异常', 'BOOM')
  except Exception as e:
    print('捕获异常: ', e)
    print(e.type) # 获取自定义异常数据




sand_box()
# -> 捕获异常:  自定义异常
# -> BOOM

异常基类

  • Exception 非系统退出异常
  • ArithmeticError 算术类异常
  • BufferError 缓冲区异常
  • LookupError 键,索引异常

常见异常类型

  • ArributeError 属性取值、赋值异常
  • EOFError 文件读取结束
  • ImportError 模块引入异常
  • ModuleNotFoundError 模块未找到
  • IndexError 索引越界
  • KeyError 键未找到
  • NameError 变量未找到
  • OSError 系统异常

文档