Python基础学习笔记(八)异常处理

本节知识大纲:

本节知识大纲

一、概念

什么是异常?

在程序运行过程中发生错误和意外,这些错误和意外往往不是语法错误。

定义:语法错误不属于异常,因为语法错误没办法让软件正常运行;正确情况下的异常指的是软件运行过程中出现的意外。

num01 = int(input('请输入第一个数:'))num02 = int(input('请输入第二个数:'))print(num01/num02)

以上代码可能出现两种异常:

(1)如果输入的值为字符型,那么会抛出数据类型转换异常;

(2)num01如果输入的值为0,那么会抛出除数为0异常

二、条件选择处理异常

为了处理上面出现的两种异常,我们可以使用条件选择处理方式

# 有可能出现两种异常:数据类型转换、除数等于0str01 = input('请输入第一个数:')str02 = input('请输入第二个数:')num01 = 0num02 = 0# 判断是否是数if str01.isdigit() and str02.isdigit():    # 确定输入的都是数字的情况下,除数等于0    num01 = int(str01)    num02 = int(str02)    if num02 == 0:        print('除数不能等于0')    else:        print('%d / %d = %d'%(num01,num02,num01/num02))else:    print('输入的两个数不都是整数')

但是使用条件选择的方式处理异常是有弊端的,因为在写程序时候,我们不可能把所有可能出现的异常都考虑得很全面,我们应当使用更加简单专业的处理方式:
try...except...else...finally
语句来处理异常。

三、异常的体系结构与处理方式

1. 体系结构:

异常的体系结构

2.异常处理

如果程序不进行异常处理,当程序遇到异常的时候,程序会终止运行(强制退出) 异常处理:当出现异常的时候,告诉用户或者开发人员出现了异常,并不影响程序的继续运行。 异常处理在代码中主要有两种方式:异常捕获、抛出异常

异常捕获有如下四种形式:

(1)try --- except

(2)try --- except --- else

(3)try --- except --- finally

(4)try --- except --- else --- finally

抛出异常:使用关键字raize

# 最基本的异常处理的例子try:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print(num01 / num02)except:    print('输入的数据不符合要求!')

四、获取异常信息

捕获异常时,将异常设置一个变量e,反馈异常的基本信息

import tracebacklist01 = [11,22,33,44,55,66]try:    print(list01[11])except Exception as e:    print('访问集合的元素出现异常!')    print(str(e))   # 反馈异常的基本信息    print(e.args[0])    # 反馈异常基本信息    print(repr(e))  # 反馈的是异常的类型和异常的基本信息

输出结果:

访问集合的元素出现异常!list index out of rangelist index out of rangeIndexError('list index out of range')

也可以打印异常的详细信息或者将异常信息生成txt文件保存下来。

print(traceback.format_exc())   # 打印异常的详细信息traceback.print_exc(file=open('./SystemLogError.txt','w'))  # 把异常信息输出到当前目录下的txt文件中

五、捕获异常

关于捕获异常其实就是对于异常的一种处理方式,主要是用try -- except语句来捕获异常;

1. try...except...语句

try:    可能出现异常的代码except:    如果出现异常执行的代码

下面我们通过一个案例来说明捕获异常该怎么使用?

案例:

输入两个数,求两数之商

(1)通用性异常

方法一:最基本的的处理异常:

try:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except:    print('程序出现异常!')

这种没有把具体什么异常反馈出来。

方法二:给用户一个基本提示,然后将详细信息写入日志

import tracebacktry:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except:    print('代码运行出现异常,请联系管理员')    traceback.print_exc(file = open('./AppErrorLog.txt','w'))

方法三:尽量展示异常的信息

import tracebacktry:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except Exception as e:    print('程序出现异常',str(e))  # 展示基本信息    print('程序出现异常',repr(e)) # 展示异常类型和基本信息    print(traceback.format_exc())   # 展示详细信息

(2)具体化异常

我们在捕获的时候不用通用的异常类Exception,而是使用具体的如ValueExceptionZeroDivisionError,这样来捕获更加具有针对性:

import tracebacktry:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except ValueError as e:    print('输入的值不是整数:')except ZeroDivisionError as e:    print('除数不能为整数')except Exception as e:    print('未知的异常,具体查看日志')    traceback.print_exc(file=open('./AppErrorLog.txt','w'))

这样我们的程序才会具有更高的稳定性。

2. try...except...else语句

import tracebacktry:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except ValueError as e:    print('输入的值不是整数:')except ZeroDivisionError as e:    print('除数不能为整数')except Exception as e:    print('未知的异常,具体查看日志')    traceback.print_exc(file=open('./AppErrorLog.txt','w'))else:    print('所有程序均正常运行!')

这里else语句表明代码在执行过程中没有发生任何异常,打印提示信息“所有程序均正常运行”。

3. try...except...finally语句

try:    可能出现异常的代码except:    如果出现异常执行的代码finally:    无论是否有异常都执行的代码

这里的finally主要的功能是做资源的回收,比如我们打开一个文件读取里面的东西,当我们把文件读完了后,我们需要把这个文件关闭;当我们访问数据库的时候需要跟数据库建立连接当访问结束的时候,我们需要把这个连接关闭,这些都属于资源的回收针对这种场景,我们都应该把它放到finally语句后。

try:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except Exception:    print('代码出现异常')finally:    print('===fianlly中代码执行了===')

无论try中的代码是否正常,finally中的代码都会被执行finally代码主要是针对资源的回收:打开文件的关闭,或者打开数据库后关闭连接。

4. try...except...else...finally语句

try:    可能出现异常的代码except:    如果出现异常执行的代码else:    如果没有出现异常则执行的代码finally:    无论是否有异常都执行的代码

案例

try:    num01 = int(input('请输入第一个数:'))    num02 = int(input('请输入第二个数:'))    print('%d / %d = %.2f'%(num01,num02,num01/num02))except Exception:    print('代码出现异常')else:   # 如果没有异常则执行的代码    print('===else中的代码===')finally:    # 不管有没有异常都执行的代码    print('==fianlly中代码===')
(0)

相关推荐

  • 算法创作|求任意N个整数中的最大值和最小值

    问题描述如何求得任意N个整数的最大值与最小值解决方案解决这个问题有三种常见思路,第一种思路比较简单粗暴,就是对用户输入的每个整数两两之间进行比较,直到找到最大的整数和最小的整数为止.第二种思路是将用户 ...

  • Python教程:Python的条件语句

    上次我们学习了关于Python的运算符的知识,这次我们来学习Python的条件语句.python的条件语句是一种选择结构,因为它是通过if关键字实现的,因此也称为if语句.(与C和Java不同,pyt ...

  • Python教程:条件控制语句

    在软件工程史上,结构化程序设计是一个里程碑.在程序设计中,将程序划分为顺序结构.条件结构和循环结构三种结构.尽管并非每个程序都有这三个结构,但大多数大型程序都有这三个. 顺序结构,就是从上往下顺序执行 ...

  • python——循环(for循环、while循环)及练习

    目标程序的三大流程 1.while 循环的基本使用2.break 和 continue3.while 循环嵌套123 在程序开发中,一共有三种流程方式: 顺序:从上向下,顺序执行代码分支:根据条件判断 ...

  • 深入 Python 异常处理

    (给Python开发者加星标,提升Python技能) 来源:Python之王-小sen [导语]:本文结合例程总结Python异常处理的相关知识,帮你深入理解python异常处理. 在Python 中 ...

  • 超详细的 Python 基础语句总结(多实例、视频讲解持续更新)

    目录 一.运算符 1.1 + --两个对象相加 1.2 - --得到负数或是一个数减去另一个数 1.3 * --两个数相乘或是返回一个被重复若干次的字符串.列表.元组 1.4 / --两个数相除 1. ...

  • python try异常处理

    什么是异常 python异常捕获,在刚开始学的时候,经常会遇到两种报错信息:语法错误和执行的异常. 语法错误在执行的时候就会报错,同时控制端会告诉你错误所在的行: 但即便python程序语法是正确的, ...

  • Python基础学习笔记(十三)图形化界面Tkinter

    本节知识大纲: 本节知识框架 Python里的图形化界面(GUI)模块主要有Tkinter(python自带).PyQt.wxPython,我们这节主要讲解Tkinter组件: 一.Tkinter介绍 ...

  • Python基础学习笔记(一)变量与数据类型

    https://m.toutiao.com/is/J3fN6eK/ Python是一门易学的面向对象的程序设计语言,可以轻易地完成界面.文件.封装等高阶需求,可移植性好,有非常多功能强大的库与包,如N ...

  • Python基础学习笔记(五)集合与字典

    本节知识大纲: 集合 字典 一.Set 集合的概念 1. set 集合的性质 set 集合是一组无序的且不能重复的集合,打印 set 集合时会自动消除重复的元素项: set 集合用大括号表示: set ...

  • Python爬虫学习笔记(三)

    Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request# 1.添加URLurl = &quo ...

  • C#线程学习笔记八:async & await入门一

    一.涉及内容 async & await是C# 5.0引入的,控制台输出所使用的$符号(拼接字符串)是C# 6.0引入的,其功能类似于string.Format()方法. 二.多线程.异步.同 ...

  • Rust基础学习笔记(零):复习基本知识

    由于一个学期没有碰Rust,相关知识殆已忘尽.最近各课逐渐停授,余出时间来从基础重温这些知识,也算是对没有写的基础知识的补充.另外这次复习主要参照了Youtube上的Crush Course视频,两个 ...

  • 精益生产(Lean Production)基础学习笔记——第26讲

    第四节 防 错 法 一.防错概述 防错也叫防呆,是指通过设计一种方法或程序,消除产生差错的条件或使出错的机会减到最低,它是一种在作业过程中采用自动作用.报警.标识.分类等手段,使作业人员不特别注意也不 ...

  • MyBatis-Plus学习笔记(八) 代码自动生成器

    AutoGenerator 是 MyBatis-Plus 的代码生成器 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.Controller ...

  • Python编程学习笔记(5)

    截止目前我们已经能读取并显示一个指数或者任一一个个股的收盘价及其图形.这种图形到处可以看到,并不稀奇.我们可以利用聚宽的函数获取更多的更有价值的数据. 第二个小目标 画出任一一只个股最近10年的的市盈 ...