你可能会想,卧槽这标题取的,前面不是说异常就是报错吗?异常还能运用?

是的,异常确实可以运用,可以刻意制造异常,在出现异常时捕获异常并对异常处理,所以进入本篇博文的话题—异常处理

异常处理:

异常处理分两个,捕获异常抛出异常

一、捕获异常

1.为什么要捕获异常?

这个问题应该都会想到的,出错就出错,改就是啊,不急,先看一个例子:

我个人理解:在实际的开发中,异常是很常见的,程序员需要事先考虑所有的可能性,不然的话,你把你的程序给用户用,出现像上面这个情况,这样影响很大,在客户的角度,他们不管是什么,也不会在意这报错的是什么,他们希望的就是代码运行,永远不会出错,该怎么样就怎样的,如果出错,他们就会觉得不行,体验差,然后跟你抱怨怎么样怎么样,在他们心里也会觉得你并不是一个好的程序员。所以,异常,我们是在开发时就要考虑所有的可能性的,并且对每个可能性做出针对性的处理,让客户看不到这段红色的报错,并且用一个简单的或者通俗易懂的提示告诉客户哪里有问题。所以需要捕获异常

2.怎么捕获:

使用try-except[-finally]语句捕获异常

格式:

try:
     检测范围(代码块)
except Exception[as reason]  #使用Exception表示接受所有的异常,因为前面说了Exception是所有异常的基类
     出现异常(Exception)后的处理代码
finally:
     无论如何都会被执行的代码

例:

注意:

1):这里的except语句就是用来捕获异常类的,当你知道程序会报什么类型的错,就在后面写上什么异常类,这就是捕获

2):finally语句并不是必须出现,可以省略,finally语句的作用是无论如何都要运行,不管捕获到异常与否(下面会详解)

3):try语句其实也是判断语句中的一种,和if语句很相似,只是相对if比较特殊

3.else语句

说到这里,我想你应该发现了,try语句是捕获异常的,那如果程序没有出错呢?如果程序没错,那必须得输出结果对吧?前面又说到其实try语句就是判断语句中的一种,那么if都可以有else,try可不可有呢?当然可以,else语句就是当程序没错时作输出用的(是不是和if判断语句里的用法不太一样?下面会详解)。例:

不过要注意的是,else语句必须写在finally语句前面,不然啊报错:

4.打印异常

前面的代码中,可以看出程序捕获到异常后,会反馈给用户一个提示。但是又出现一个很常见的问题,在开发中,虽然我们尽可能的把我们想到的所有可能性做出了相应的解决方案,但是总有百密一疏的时候对吧?那么我们的程序在出现BUG的时候,由于我们把异常规避了,给用户一个提示完事,那万一就是这里出现错误,我们需要根据异常来修复程序,但是异常被规避了看不到啊,怎么办呢?

这里就又有一个新的写法:as语句(在前面导入模块时用过的)

看到没,我把这个异常类用as语句定义到一个变量里,然后打印这个变量,这样,上面那句话是提示给用户的,下面那句话就给我们程序员看的。这样是不是就给我们带来方便了?

二、抛出异常

1.什么是抛出异常:

为了开发需要,刻意的让程序报错

2.怎么抛出:

使用raise语句

格式:

raise  异常类

例:

 

raise语句就可以刻意的制造异常

三、从实际案列中剖析问题

例:打开文档并打印文档内容

在前面【文件操作】那一章应该都知道文件操作,如果不再需要文件,最后要把文件关闭的对吧?那么在程序某个过程报错时,程序就会跳出并结束,下面的代码就不再进行,所以根本到不了关闭语句那里,但是此时文件还是开启状态的,所以文件就一直是挂起状态,这样对开发的影响是很大的。而这里有了finally语句就可以无论如何都运行,所以无论如何都会在最后执行关闭语句把文件关闭了,这里就可以看出finally语句的功效了

前面文件操作时,应该介绍过with语句了,这里既然都说到文件操作,就再提一下。

with语句的功能就是在打开对象时,如果在一定时间内不再对对象有操作,那么with语句将会自动的把对象关闭,这也是python的回收机制的功劳

注意:

1.当有使用with语句,就可以不使用finally语句来关闭文件

2.python2和python3里异常类有点不同:

1):python2:

2):python3:

python2和python3还有哪些不同不一一解析,自己去体验吧,如果后面有时间,我专门开一篇博文介绍python2和python3的差别

四、else语句在if语句,while和for循环语句和在try语句里的区别

  • 在if循环里:else表示否则则运行
  • 在while和for循环里:else表示干完了能怎样,或者表示干不完就别想怎样。但当有break跳出循环,则不运行else
  • 在try语句里:else表示如果没有异常,那就运行,有问题就不会运行

好的,异常处理这一块讲解完毕

洗礼灵魂,修炼python(28)--异常处理(2)—>运用异常的更多相关文章

  1. 洗礼灵魂,修炼python(85)-- 知识拾遗篇 —— 深度剖析让人幽怨的编码

    编码 这篇博文的主题是,编码问题,老生常谈的问题了对吧?从我这一套的文章来看,前面已经提到好多次编码问题了,的确这个确实很重要,这可是难道了很多能人异士的,当你以为你学懂了,在研究爬虫时你发现你错了, ...

  2. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  3. python基础-异常处理

    一.错误和异常 程序中难免出现错误,而错误分成两种 1.1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def te ...

  4. what's the python之异常处理

    what's the 异常 python程序中会出现异常,即bug.若出现异常程序就报错,异常之后的代码就不会继续往下执行,这是一个正常程序不允许出现的,但是在某些程序交互的时候难免会因为用户输入问题 ...

  5. python的异常处理及异常类定义

    python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语 ...

  6. Python(异常处理)

    一 错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发 ...

  7. Python之异常处理(Day27)

    一.错误和异常 part1: 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def test: pass #语法错 ...

  8. Python编程-异常处理

    一.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) #语法错误示范一 if #语法错误示范二 def t ...

  9. python之异常处理模块

    一 . python 内置的异常类 在程序运行过程中,如果出现错误,python解释器会创建一个异常对象,并抛出给系统运行时.即程序终止正常执行流程,转而执行异常处理流程. 在某种特殊条件下,代码中也 ...

  10. [python]python的异常处理

    异常处理:首先了解异常,程序出现逻辑错误或者用户输入不合法都会引发异常,而这些异常并不是致命的所以不会导致程序崩溃死掉.可以利用Python提供的异常处理机制在异常出现时及时捕获,并从内部自我消化. ...

随机推荐

  1. JS闭包与JS函数

    先说说在网上看到的一个闭包案例: var add = (function () {var counter = 0;return function () {return counter += 1;}}) ...

  2. Jpush极光推送的一些心得

    在集成极光推送的时候,test完全正常.部署到服务器后只发送一条推送之后推送不继续发送.经排查: 2018-06-28 10:24:26.394 [ThreadPoolTaskExecutor-4] ...

  3. UML类图中的六种关系(物理设计阶段)

    UML类图中经常会用到各种箭头和线条来表示不同类或者接口之间的关系,因此非常好的理解各个图标的含义是很有必要的. 在物理设计阶段可以通过EA工具将类图搭建好,然后直接生成物理类,这样也可以减少物理设计 ...

  4. 第六章:四大组件之Activity

    tivityActivity作为Android四大组件之一,也是其中最重要的一个组件.作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互 ...

  5. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  6. Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现

    菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作. 提供一个菜单查询接口,查询整颗菜单树形结构. http/modules/menu.js 添加 findMenuTree 接口. ...

  7. 区块链 + 大数据:EOS存储

    谈到区块链的存储,我们很容易联想到它的链式存储结构,然而区块链从比特币发展到今日当红的EOS,技术形态已经演化了10年之久.目前的EOS的存储除了确认结构的链式存储以外,在状态存储方面有了很大的进步, ...

  8. Linux下lz4解压缩命令小结

    lz4是一个让"人见人爱.花见花开"的压缩算法,能够在多核上很好的扩展.lz4在压缩率上略微逊色, 但是在解压速度上有着惊人的优势 (大概是gzip的3倍(多次测试对比)).因为压 ...

  9. spring-boot-2.0.3启动源码篇二 - run方法(一)之SpringApplicationRunListener

    前言 Springboot启动源码系列还只写了一篇,已经过去一周,又到了每周一更的时间了(是不是很熟悉?),大家有没有很期待了?我会尽量保证启动源码系列每周一更,争取不让大家每周的期望落空.一周之中可 ...

  10. .Net Core缓存组件(Redis)源码解析

    上一篇文章已经介绍了MemoryCache,MemoryCache存储的数据类型是Object,也说了Redis支持五中数据类型的存储,但是微软的Redis缓存组件只实现了Hash类型的存储.在分析源 ...