【JS逆向课件:第八课:异常处理】

异常处理

  • 首先我们要理解什么叫做**"异常”**?

    • 在程序运行过程中,总会遇到各种各样的问题和错误。
    • 有些错误是我们编写代码时自己造成的:
      • 比如语法错误、调用错误,甚至逻辑错误。
    • 还有一些错误,则是不可预料的错误,但是完全有可能发生的:
      • 比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。
    • 这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。大多数的异常都不会被程序处理,而是以错误信息的形式展现出来。
    #0不能被作为除数
    1/0
    异常信息为:ZeroDivisionError: division by zero
    
  • 异常的分类:

    • 异常有很多种类型,Python内置了几十种常见的异常,无需特别导入,直接就可使用。
    • 需要注意的是,所有的异常都是异常类,首字母是大写的!
  • 异常的危害:

    • 如果程序中一旦出现了异常的语句代码,则该异常就会立即中断程序的运行!
  • 因此:

    • 为了保证程序的正常运行,提高程序健壮性和可用性。我们应当尽量考虑全面,将可能出现的异常进行处理,而不是留在那里,任由其发生。
  • python处理异常的机制:

    • Python内置了一套try…except…finally…的异常处理机制,来帮助我们进行异常处理。其基本语法是:

    • try:pass
      except Exception as ex:pass
      
    • 机制说明:

      • 首先,执行try子句(在关键字try和关键字except之间的语句)

      • 如果没有异常发生,忽略except子句,try子句执行后结束。

      • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。

      • try:print("发生异常之前的语句正常执行")print(1/0)print("发生异常之后的语句不会被执行")
        except ZeroDivisionError as e:print(e)
        
    • 如果程序发生的异常不在你的捕获列表中,那么依然会抛出别的异常:

    • # 未捕获到异常,程序直接报错
      s1 = 'hello'
      try:int(s1)
      except IndexError as ex:    # 本例为非法值异常,而你只捕获索引异常print(ex)
      
  • Exception是什么?

    • 在Python的异常中,有一个通用异常:Exception,它可以捕获任意异常。
    • 思考:那么既然有这个什么都能管的异常,其他诸如OSError、ZeroDivisionError的异常是不是就可以不需要了?
      • 当然不是!很多时候程序只会弹出那么几个异常,没有必要针对所有的异常进行捕获,那样的效率会很低。另外,根据不同的异常种类,制定不同的处理措施,用于准确判断错误类型,存储错误日志,都是非常有必要甚至强制的。
    • 常见的异常类型:
    异常名解释
    AttributeError试图访问一个对象没有的属性
    IOError输入/输出异常
    ImportError无法引入模块或包;多是路径问题或名称错误
    IndentationError缩进错误
    IndexError下标索引错误
    KeyError试图访问不存在的键
    KeyboardInterruptCtrl+C被按下,键盘终止输入
    NameError使用未定义的变量
    SyntaxError语法错误
    TypeError传入对象的类型与要求的不符合
    UnboundLocalError试图访问一个还未被设置的局部变量
    ValueError传入一个调用者不期望的值,即使值的类型是正确的
    OSError操作系统执行错误
  • Python的异常机制具有嵌套处理的能力:

    • 比如在函数f3()调用f2(),f2()调用f1(),虽然是在f1()出错了,但只需要在f3()进行异常捕获,不需要每一层都捕获异常

    • #函数嵌套出现异常
      def f1():return 10/0def f2():f1()def f3():f2()f3()
      
    • 函数嵌套处理异常:

    • def f1():return 10/0def f2():f1()def f3():f2()try:f3()
      except Exception as e:print(e)
      
  • try…excetion的嵌套

    • 之前我们说过,不是只使用通用的异常类Exception就万事大吉了,为了效率问题,我们需要对常见的异常信息进行精准的捕获,那么如果异常出现在用户层的话,则就需要对用户操作可能会出现的异常进行判断然后精准捕获了,如何操作呢?

      • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。也就是前面说的嵌套处理能力。直到程序最顶端如果还没有被捕获,那么将弹出异常。

      • try:try:print("发生异常之前的语句正常执行")print(1/0)print("发生异常之后的语句不会被执行")except ValueError as e:print(e)except ZeroDivisionError as e:print("里层没有抓好,只能辛苦我外层了")
        
      • 或者使用一个try和多个except的形式:

      • try:print("发生异常之前的语句正常执行")print(1/0)print("发生异常之后的语句不会被执行")
        except NameError as e:print(e)
        except ZeroDivisionError as e:print("我是第一个抓取到除零异常的")
        except (ValueError,ZeroDivisionError) as e:print("我是备胎")
        
      • 或者在except后面跟一个元组,元组中包含多个异常类

    • except (RuntimeError, TypeError, NameError):pass
      
  • finally和else子句

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

    • 同样的,还有一个可选的finally子句。无论try执行情况和except异常触发情况如何,finally子句都会被执行!

    • 当然,else和finally同时存在时:

    • try:pass
      except:pass
      else:print("else")
      finally:print("finally")
      

推导式

  • Python语言有一种独特的语法,相当于语法糖的存在,可以帮你在某些场合写出比较精简酷炫的代码。但没有它,也不会有太多的影响。Python语言有几种不同类型的推导式

    • 列表推导式
    • 字典推导式
    • 集合推导式
    • 元组推导式?
  • 列表推导式

    • 列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句,如下例子所示:

    • alist = [x*2 for x in range(1,10)]
      print(alist)
      ############上下两组代码是等效
      alist = []
      for x in range(1,10):alist.append(x*2)
      print(alist)
      
  • 列表推导式要这么理解,首先执行for循环,对于遍历的每一个x,代入x*x表达式中进行运算,将运算结果逐一添加到一个新列表内,循环结束,得到最终列表。它相当于下面的代码:

  • alist = []for x in range(1,10):alist.append(x*2)
    print(alist)
    
    • 作用:

      • 列表推导式为我们提供了一种在一行内实现较为复杂逻辑的生成列表的方法。其核心语法是用中括号[]将生成逻辑封装起来。当然列表推导式也有多样用法
  • 增加条件语句

  • alist = [x * x for x in range(1,11) if x % 2 == 0]
    print(alist)##############相当于如下代码
    alist_1 = []
    for x in range(1,11):if x % 2 == 0:alist_1.append(x*x)
    print(alist_1)
    
  • 多重循环

    • re = [a+b for a in '123' for b in 'abc']
      print(re)#############
      alist = []
      for a in '123':for b in 'abc':alist.append(a+b)
      print(alist)
      
  • 字典推导式

    • 既然使用中括号[]可以编写列表推导式,那么使用大括号呢?你猜对了!使用大括号{}可以制造字典推导式!

    • dic = {x:x**2 for x in [2,4,6]}
      print(dic)'''
      dic = {}
      for x in [2,4,6]:dic[x] = x**2
      '''
      
    • 注意x: x**2的写法,中间的冒号,表示左边的是key右边的是value。

  • 集合推导式

    • 大括号除了能用作字典推导式,还可以用作集合推导式,两者仅仅在细微处有差别。

    • a = {x for x in 'aabbccddeeff'}
      print(a)
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vst 算法R语言手工实现 | Seurat4 筛选高变基因的算法

1. vst算法描述 (1)为什么需要矫正 image source: https://ouyanglab.com/singlecell/basic.html In this panel, we observe that there is a very strong positive relationship between a gene’s average expression and its observed variance. I…

OpenAI 推出 GPT-4o mini,一种更小、更便宜的人工智能模型

OpenAI 最近推出了新型人工智能模型 GPT-4o mini,以其较小体积和低成本受到关注。这款模型在文本和视觉推理任务上性能优越,且比现有小型模型更快、更经济。GPT-4o mini 已向开发者和消费者发布,企业用户将在下周获得访问权限。 喜好儿网 在…

ubuntu22.04下YOLOv5 TensorRT模型部署

目录 Ubuntu22.04环境配置 1.1 安装工具链和opencv 1.2 安装Nvidia相关库 1.2.1 安装Nvidia显卡驱动 1.2.2 安装 cuda11.7 安装cuDNN 下载下载 tensorrt 下载仓库TensorRT-Alpha并设置 从yolov5源码中导出onnx文件 ​编辑 利用tensorrt编译onnx模型 编译执行yolov5-t…

spring 中的字节码文件访问 -- classreading 包

位于 spring-core 模块下的 org.springframework.core.type.classreading 包提供了读取类中元数据的功能。其实就是在不加载类的情况下,获取 class 文件中定义的类的相关信息:类名、接口、注解、方法及其注解、字段及其注解等。方便 spring 进行类型或指…

牛客0718B——Arraylist 和LinkedList static修饰变量和方法

目录 Q1:currentTimeMillis是什么? Q2:比较Arraylist 和LinkedList的查找时间 3、相关对比Vector和Arraylist 底层扩容的原理: Q4:static修饰静态代码块 修改1: 修改2: 修改3: 修改1: 修改2: Q5…

入坑树莓派(2)——树莓派4B与手机蓝牙通信

入坑树莓派(2)——树莓派4B与手机蓝牙通信 1、引言 在入坑树莓派(1)中已经搞掂了可视化问题。现在继续开展下一步,尝试与手机通信,一开始是想弄wifi连接的,但发现基于wifi的APP比较难弄,为了降低开发的难度,又因为树莓派板子自带蓝牙模块,所以直接选用蓝牙连接手机…

LabVIEW多串口通信

随着现代工业控制对数据采集和处理效率的要求不断提升,传统的单串口通信已无法满足多通道数据传输与大规模数据存取的需求。开发一种基于LabVIEW的多串口通信及数据存储系统,以提升数据处理速度和存储效率,保障生产线的稳定运行显得尤为重要。…

达梦+flowable改造

原项目springbootflowablemysql模式现需改造springbootflowable达梦&#xff0c; 1.在项目中引入达梦jpa包 引入高版本包已兼容flowable&#xff08;6.4.2&#xff09;liquibase&#xff08;3.6.2&#xff09; 我没有像网上做覆盖及达梦配置 <dependency> …

数据结构之树的存储结构详解与示例(C/C++)

文章目录 树的存储结构1. 顺序存储结构2. 链式存储结构结论 树&#xff08;Tree&#xff09;是一种非常常见的数据结构&#xff0c;它模拟了一种层级或分支结构。树由节点&#xff08;或称为顶点&#xff09;组成&#xff0c;每个节点包含一个值&#xff0c;并且可能有多个子节…

SpringDoc2问题汇总

在项目中尝试使用SpringDoc进行文档生成&#xff0c;在使用过程中遇到一系列的问题加以记录. 1.引入依赖 只是单纯的使用SpringDoc的话不需要引入一些乱七八糟的依赖&#xff0c;如今各种增强和拓展依赖层出不穷&#xff0c;但是随着这些依赖的出现带来的不仅是增强&#xff0…

在学习使用LabVIEW的过程中,需要注意哪些问题?

在学习使用LabVIEW的过程中&#xff0c;需要注意以下问题&#xff1a; 1. 基础知识 图形化编程思维&#xff1a; LabVIEW采用图形化编程方式&#xff0c;与传统的文本编程语言有很大不同&#xff0c;需要适应这种新的编程思维方式。数据流概念&#xff1a; 理解LabVIEW的核心数…

调用第三方接口-OkHttpClient

请求方式 POSTGET POST 单个新增 例如后端接口接收参数为 User user 使用OkHttpClient发送post请求 //封装body信息 JsonObject jsonObject new JsonObject(); jsonObject.put("userName","张三"); jsonObject.put("city","北京");…

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境&#xff0c;已有交换机组网环境&#xff0c;服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中&#xff0c;我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练&#xff0c;旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

Git技巧:如何重命名你的分支

0. 引言 本文将介绍如何在本地以及远程仓库中安全地重命名 Git 分支。 1. 在本地重命名分支 在本地重命名分支可以通过 git branch 命令完成&#xff0c;具体有两种方法&#xff1a; 方法1&#xff1a;当前分支重命名 如果你当前正在 old 分支上工作&#xff0c;想要将其重…

numpy的一些基本操作

文章目录 1.numpy数组的多种创建方式1.1使用np.array()创建1.2使用plt创建1.3使用np的routine函数创建 2.numpy的常用属性2.1shape2.2ndim2.3size2.4dtype 3.numpy的索引和切片3.1切出前两列数据3.2切出前两行数据3.3切出前两行的前两列的数据3.4数组数据翻转3.5练习&#xff1…

【权威发布】2024年生物技术与医学国际会议(IACBM 2024)

2024年生物技术与医学国际会议 2024 International Conference on Biotechnology and Medicine 【1】会议简介 2024年生物技术与医学国际会议旨在为全球生物技术与医学领域的专家学者提供一个交流最新研究成果、分享技术进展和探讨未来发展方向的平台。会议旨在加强国际间的学术…

阿里云 https证书部署

一.申请证书 二.查看状态 查看状态&#xff0c;已签发是完成了申请证书 三.部署 我在nginx服务器上部署 具体操作链接:阿里云文档 修改前 修改后 四.重启ngnix 五.验证是否成功 在浏览器输入域名查看

vue2关于Object.defineProperty实现响应式

实现步骤&#xff1a; 1. 初始化阶段 当 Vue 实例化时&#xff0c;会遍历data 选项中的属性&#xff0c;并使用 Object.defineProperty 将它们转换为 getter 和 setter。这样一来&#xff0c;每当访问或修改这些属性时&#xff0c; Vue就能捕获到这些操作&#xff0c;从而实现…

【JavaScript 算法】最长公共子序列:字符串问题的经典解法

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理状态转移方程初始条件 二、算法实现注释说明&#xff1a; 三、应用场景四、总结 最长公共子序列&#xff08;Longest Common Subsequence&#xff0c;LCS&#xff09;是字符串处理中的经典问题。给定两个字符串…