当前位置: 首页 > news >正文

一、开发基础(4)

异常处理

无论在何种编程语言中,都会碰到程序异常,有些是因为代码错误导致的不可预见性异常,这个要去调用栈检查。

而另一类异常是由程序员故意设置的异常,用于提醒用户或后面的程序。

在Python中默认的异常处理是解释器运行遇到错误时,一直向上返回到程序顶层,启用默认的处理器即打印出错信息到屏幕。

还有捕获异常,通过try/except语句在程序内启动异常处理器,此时异常不会一直向上返回。

另一种是触发异常,即raise、assert语句,raise语句用来直接触发异常,assert语句用来做判断,若判断不通过则触发异常。

编程者也能自定义异常,从内置异常类Exception继承。

try/except和try/finally

前者用于捕获异常并从异常中恢复,即不中断主程序。

后者用于提供终止行为,即无论是否出错都会执行的行为,并且如果有异常,也会先执行finally代码后再向上返回异常。

try/except/else

用于捕捉异常,主程序在try中,并且如果没有异常,则会执行else语句中的代码,否则不执行。

在2.5以后的版本中,else可以与finally组合使用,并且至少有except语句的时候才能使用else。

单独raise语句用于重新引发当前异常

assert语句与测试模式

在代码中使用__debug__判断并执行raise语句用于测试,在编译时调用-O参数可以移除assert语句的字节码

with/as用于替代try/finally语句,并且支持更丰富的协议

  1. 计算表达式,所得到的对象称为环境管理器,必须有__enter__和__exit__方法
  2. 环境管理器的__enter__方法会被调用,如果as子句存在,其返回值会赋值给as子句中的变量,否则直接丢弃
  3. 代码块中嵌套的代码会执行
  4. 如果with代码引发异常,__exit__(type, value, traceback)方法会被调用。异常重新引发,传递到with外
  5. 如果with代码没有异常,__exit__依然调用,其参数都以None传递。
    class TraceBlock:
        def message(self, arg):
            print('running', arg)
        def __enter__(self):
            print('running with block')
            return self
        def __exit__(self, exc_type, exc_value, exc_tb):
            if exc_type is None:
                print('Exited normally\n')
            else:
                print('Raise an exception!', exc_type)
                return False

    with TraceBlock() as action:
        action.message('test 1')
        print('reached')

    with TraceBlock() as action:
        action.message('test 2')
        raise TypeError
        print('not reached')

错误是异常,但异常不一定是错误。

转载于:https://www.cnblogs.com/ikct2017/p/9448394.html

相关文章:

  • Vue学习笔记之Webpack介绍
  • 第一次python词云尝试
  • 论优越感
  • 【院校巡礼】em兰州大学/em - 叁研良语的文章 - 知乎
  • μC/OS-III 概述
  • centos6.5使用yum安装redis 设置开机启动
  • 初识设计模式(建造者模式)
  • 支付系统整体架构
  • Sketch 介绍
  • 简单的自创线程池
  • python网络编程三次握手和四次挥手
  • javascript基础知识(4) 字符串
  • C语言讨论象棋将帅问题,代码短又美!
  • python存储json文件
  • 6.0 实现app登录
  • ➹使用webpack配置多页面应用(MPA)
  • hadoop集群管理系统搭建规划说明
  • javascript从右向左截取指定位数字符的3种方法
  • Mac转Windows的拯救指南
  • Python学习之路13-记分
  • Wamp集成环境 添加PHP的新版本
  • WebSocket使用
  • 多线程 start 和 run 方法到底有什么区别?
  • 今年的LC3大会没了?
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数据可视化之 Sankey 桑基图的实现
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 协程
  • 学习ES6 变量的解构赋值
  • 一、python与pycharm的安装
  • 国内开源镜像站点
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (6)设计一个TimeMap
  • (超详细)语音信号处理之特征提取
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (五)网络优化与超参数选择--九五小庞
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Framework杂记
  • .NET 反射的使用
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Android]常见的数据传递方式
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [CSS]CSS 字体属性
  • [HDU 3555] Bomb [数位DP]