Python全栈工程师(异常(基础))
Python人工智能从入门到精通
补充:包的相对导入 只对后两种导入方式有用 前两次改进的学生管理系统在20课中 已补充
异常(基础)except:
什么是错误:
是指由于逻辑或语法等导程序无法正常执行的问题
什么是异常:
是程序出错的标识符的一种状态
当异常发时 程序不会再向下执行,而转去调用此函数的地方
待处理此错误并恢复为正常状态
异常的作用:
用作信号, 通知上层调用者有错误产生需要处理
try 语句:
两种语法:
ry-except语句(接受异常通知)
try-finally语句
try-except 语法 :
try:
可能触发异常的语句
except 错误类型1[as 变量1]:
异常处理语句2
except 错误类型2[as 变量2]:
异常处理语句2
except (错误类型3, 错误类型4,...)[as 变量3]:
异常处理语句3
......
except:
异常处理语句(其他)(匹配所有类型错误)
else:
未发生异常语句(可以没有此语句 没有发成异常时调用)
finlly:
最终语句
作用:
尝试捕获异常, 将程序由异常状态转为正常状态并正常执行
说明:
1. as 子句是用于绑定错误对象的变量,可以省略
2. except 子句可以有一个或多个,但至少要有一个
3. else 子句最多只能有一个,也可以省略不写
4. finally 子句最多只能有一个,也可以省略不写
5. else 子句将在try没有出现异常时执行
6. finally子句的语句在任何情况下都会被执行
示例:
# 此示例示意用try-except 语句捕获异常并做出相应的处理
def div_apple(n):
print("%d个苹果您想分给几个人?" % n)
s = input("请输入人数: ")
cnt = int(s) # <- 此处可能触发ValueError类型错误
result = n / cnt # <- 此处可能触发ZeroDivisitionError错误
print("每个人分了%d个苹果" % result) try:
print("开始分苹果")
div_apple(10) # 可能触发异常的调用
print("结束分苹果")
except ValueError:
print("发生成值错误,已处理并转为正常状态!")
except ZeroDivisionError:
print("发生了被零除的错误,程序已转为正常状态") print("程序正常执行并完全任务,退出程序")
try-finally语法:
try:
可能触发异常的语句
finally:
最终语句
说明:
1.finally子句不可以省略
2.一定不存在except子句
作用:
通常try-finally语句来做触发异常时必须要处理的事情
无论异常是否发生, finally子句一定会被执行
注意:
try-finally 语句不会改变程序的(正常/异常)状态
示例:
# 以下以 煎蛋为例示意 try-finally语句的用法
# 必须要做的事情是,关闭天燃气 def fry_egg():
print("打开天燃气点燃...")
try:
count = int(input("请输入鸡蛋个数: "))
print("完成煎鸡蛋,共煎了%d个鸡蛋" % count)
finally:
print("关闭天燃气") fry_egg()
raise 语句:(发起异常通知)
作用:
触发一个错误, 让程序进入异常状态
语法:
raise 异常类型
或
raise 异常对
实例:
def make_exception():
print("函数开始")
# 发出一个ValueError类型的错误通知给调用者
# raise ValueError
err = ValueError("这是自定义的错误数据")
raise err # 用 err触发一个异常通知
print("函数结束") try:
make_exception()
print("make_exception调用结束!")
except ValueError as e:
print("接收到ValueError类型的异常通知")
print("错误对象是:", e)
assert 断言语句:
语法:
assert 真值表达式, 错误数据(通常是字符串)
作用:
当真值表达式为False时, 用错误数据创建一个AssertionError
类型的错误, 并进入异常状态
等同于:
if 真值表达式 == false
raise AssertrtionError(错误数据)
实例:
def get_score():
s = int(input("请输入学生成绩: "))
assert 0 <= s <= 100, '成绩超出范围'
# if not (0 <= s <= 100):
# raise AssertionError('成绩超出范围')
return s try:
score = get_score()
except AssertionError as err:
print("错误数据是:", err)
print('获取成绩失败')
score = 0 print("学生的成绩为:", score)
小结:
异常处理语句(4条):
try-except 语句:
用于接受异常通知, 捕获异常
try-finally 语句:
执行必须执行的语句
raise 语句:
发送异常通知, 并进入异常状态
assert 语句:
根据条件选着性的发送 AssertionError类型的异常通知
为什么要处理异常机制:
在程序调用层数比较深的时候, 向主调用函数传递错误信息 需要层层return返回
比较麻烦, 用异常处理机制可以较简单的传递错误信息
Python全部的错误类型
| 错误类型 | 说明 |
|---|---|
| 以下内容必讲 | |
| ZeroDivisionError | 除(或取模)零 (所有数据类型) |
| ValueError | 传入无效的参数 |
| AssertionError | 断言语句失败 |
| StopIteration | 迭代器没有更多的值 |
| IndexError | 序列中没有此索引(index) |
| IndentationError | 缩进错误 |
| OSError | 输入/输出操作失败 |
| ImportError | 导入模块/对象失败 |
| NameError | 未声明/初始化对象 (没有属性) |
| AttributeError | 对象没有这个属性 |
| GeneratorExit | 生成器(generator)发生异常来通知退出 |
| TypeError | 对类型无效的操作 |
| KeyboardInterrupt | 用户中断执行(通常是输入^C) |
| OverflowError | 数值运算超出最大限制 |
| FloatingPointError | 浮点计算错误 |
| BaseException | 所有异常的基类 |
| SystemExit | 解释器请求退出 |
| Exception | 常规错误的基类 |
| StandardError | 所有的内建标准异常的基类 |
| ArithmeticError | 所有数值计算错误的基类 |
| EOFError | 没有内建输入,到达EOF 标记 |
| EnvironmentError | 操作系统错误的基类 |
| WindowsError | 系统调用失败 |
| LookupError | 无效数据查询的基类 |
| KeyError | 映射中没有这个键 |
| MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
| UnboundLocalError | 访问未初始化的本地变量 |
| ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
| RuntimeError | 一般的运行时错误 |
| NotImplementedError | 尚未实现的方法 |
| SyntaxError Python | 语法错误 |
| TabError | Tab 和空格混用 |
| SystemError | 一般的解释器系统错误 |
| UnicodeError | Unicode 相关的错误 |
| UnicodeDecodeError | Unicode 解码时的错误 |
| UnicodeEncodeError | Unicode 编码时错误 |
| UnicodeTranslateError | Unicode 转换时错误 |
| 以下为警告类型 | |
| Warning | 警告的基类 |
| DeprecationWarning | 关于被弃用的特征的警告 |
| FutureWarning | 关于构造将来语义会有改变的警告 |
| OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
| PendingDeprecationWarning | 关于特性将会被废弃的警告 |
| RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
| SyntaxWarning | 可疑的语法的警告 |
| UserWarning | 用户代码生成的警告 |
| 详见:help(builtins) |
练习:
写一个函数 get_score() 来获取学生成绩,
要求用户输入 1~100的整数,输果输入出现异常,返此函数返回0,
否则返回用户输入的成绩
示例:
def get_score():
...
score = get_score()
print("学生的成绩是:", score)
练习:
1. 一个球从100米高空落下 ,每次落地后反弹高度是原高度的一半, 在落下
1)写程序算出皮球在第10次落地后反弹高度是多高?
2)打印出球共经过多少米的路程
答案:
def ball(n, m):
L = [100]
while True:
if n == 0:
print("最后弹起的高度是%s米" % s)
break
s = m * 0.5
m = s
L.append(s + m)
n -= 1
return L
print("10次共经历了%s米的路程" % sum(ball(10, 100)))

2. 分解质因数, 输入一个整数, 分解质因数 ,
如:
输入 90
则打印:
“90=2*3*3*5”
(质因数是指最小能被原数整除的素数 不包括1)
答案:
def m(n):
ret = []
while n > 1:
for i in range(n):
k = i + 2
if n % k == 0:
ret.append(k)
n = int(n / k)
break
return ret print(m(90))

3. 修改原学生信息管理程序,加入异常处理语句,让程序在任何情况下都能够按逻辑正常执行.
例如:
输入成绩和年龄时,如果用户输入非法字符串也不会导致程序崩溃
Python全栈工程师(异常(基础))的更多相关文章
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- Python全栈工程师(装饰器、模块)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 装饰器 decorators(专业提高篇) 装饰 ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
- Python全栈工程师(递归函数、闭包)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细 ...
- 【目录】python全栈工程师
第一阶段:Python 语言核心编程1. Python核心 -- 2048 游戏核心算法2. 面向对象 -- 天龙八部游戏技能系统3. Python高级 -- 集成操作框架项目:2048游 ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(1) - ES6标准入门和Flex布局
1.简述 1.什么是ES6?ES6, 全称 ECMAScript 6.0,是 JavaScript 的下一个版本标准,2015年6月份发版.ES6的主要目的是为了解决 ES5 的先天不足. 2.了解E ...
- Python全栈工程师(Python3 所有基础内容 0-0)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python一个月的基础语法 基本就到这咯 接下来是数据 ...
随机推荐
- centos下yum安装mysql5.6后,无法启动 MySQL Daemon failed to start
如果是全新安装应该就不会出现这个问题,升级安装的话,要运行 mysql_upgrade ,但是启动MYSQL就报错MySQL Daemon failed to start 如此就没办法运行mysql_ ...
- sql插入临时表数据的方法
方法有两种,主要看需求. 方法1:定义好临时表的字段和类型.插入对应的值 create table #Tmp --创建临时表#Tmp ( City varchar(), -- Country varc ...
- CUDA Texture纹理存储器 示例程序
原文链接 /* * Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved. * Data: 2012-4-20 */ // // 此程序是演示了1D和 ...
- Real VNC软件
RealVNC5.2.3+key http://yunpan.cn/cjchAkeIgEAPG (提取码:4092)
- 第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列
第51章 设置FLASH的读写保护及解除 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- 【Java】重载(Overload)与重写(Override)
方法的语法 修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值; } 重载(overload) /** * 重载Overload: * 同一个类中,多个方法 ...
- 通过增量备份恢复来处理Oracle DG 复制GAP
1.确定增备scn范围,通过alert日志获取gap日志序列GAP - thread 1 sequence 109631-117170 2.根据序列获取增备起点SCN提示最小gap序列为109631, ...
- javaWeb基础 javascript bom5个对象
bom 也称为浏览器对象 browser object model(浏览器对象模型),由五个对象组成: Window:浏览器窗口 最顶层对象. Navigator :浏览器对 ...
- html5 canvas中CanvasGradient对象用法
html5 中canvas提供了强大的渲染样式,可以实现一些比较复杂的样式设置,今天学习了CanvasGradient对象可以实现一个颜色的渐变 CanvasGradient对象可以实现两种不同形式的 ...
- P3366 最小生成树【模板+Kruscal讲解】
此题数组大小非常重要 算法过程: 现将全部边按照权值(由小到大)排序. 按顺序(同上)考虑每条边,只要这条边和之前已选择的边不构成圈,就保留这条边,否则放弃这条边. 具体算法 成功选择(n-1)条边后 ...