异常的概念

  • 程序在运行时,如果python解释器遇见一个错误,就会停止程序的运行,并且提示一些错误信息,这就是异常;
  • 程序遇见错误停止执行并且提示错误信息,这个动作我们称之为抛出(raise)异常;

异常有可能是我们没有按照代码规范而引起的;

但也有可能即使按照代码规范编写,也会出错,比如我们提示用户输入一个数字,然后int转译,但用户输入一个非数字,就会报错;

程序开发时,很难将所有情况都处理的面面俱到,通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性;

捕获异常

简单的异常捕获

在程序开发中,如果对某些代码的执行不能确定是否会正确执行,我们可以增加try(尝试)来捕获异常;

捕获异常最简单的语法格式:

try:
尝试执行的代码
except:
出现错误的处理

try 尝试,下方编写要尝试代码,不确定是否能够正确执行的代码;

except 如果不是,下方编写尝试失败的代码;

简单异常捕获示例

try:
# 不能确定是否会正确执行的代码
num = int(input("请输入一个整数:"))
except:
# 处理出现错误之后代码
print("请确保你输入的是一个整数") print("-"*50) # 请输入一个整数:1
# -------------------------------------------------- # 请输入一个整数:a
# 请确保你输入的是一个整数
# --------------------------------------------------

错误类型捕获

在程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常,做出不同的响应,这个时候,就需要使用错误类型捕获了。

错误类型捕获语法如下:

try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
# 针对错误类型2和3,对应的代码处理
pass
# 下面三句是后面的内容
except Exception as e:
print("未知异常:", e)

当python解释器抛出异常后,最后一行错误信息的第一个单词,就是错误类型,例如下面,错误信息就是 ZeroDivisionError;

ZeroDivisionError: division by zero

错误类型捕获代码演示

while 1:
try:
num = int(input("请输入一个整数:")) result = 8/num
print("8除以这个数字的结果是:", result)
break except ZeroDivisionError:
print("你输入的是一个0,不能被除,请重新输入")
continue except ValueError:
print("请确保你输入的是一个整数,请重新输入")
continue except Exception as e:
print("出错了:%s ,请重新输入", e)
continue # 请输入一个整数:0
# 你输入的是一个0,不能被除,请重新输入
# 请输入一个整数:a
# 请确保你输入的是一个整数,请重新输入
# 请输入一个整数:2
# 8除以这个数字的结果是: 4.0

捕获未知异常

在开发时,要预判到所有可能出现的错误,是很难的;

如果希望程序无论出现任何错误,都不会因为python解释器抛出异常而被终止,可以增加如下语句:

except Exception as e:
print("出错了:%s ,请重新输入", e)

捕获未知异常演示

while 1:
try:
num = int(input("请输入一个整数:")) result = 8/num
print("8除以这个数字的结果是:", result)
break except ValueError:
print("请确保你输入的是一个整数,请重新输入")
continue except Exception as e:
print("出错了:%s ,请重新输入", e)
continue # 请输入一个整数:a
# 请确保你输入的是一个整数,请重新输入
# 请输入一个整数:0
# 出错了:division by zero ,请重新输入
# 请输入一个整数:1
# 8除以这个数字的结果是: 8.0

异常捕获完整语法

在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:

try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except (错误类型2,错误类型3):
# 针对错误类型2和3,对应的代码处理
pass
except Exception as e:
print("未知异常:", e)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否出现异常都会执行的代码
pass
  • else 是 只有在没有异常时才会执行的代码;
  • finally 是 无论是否出现异常都会执行的代码;

异常捕获完整语法示例

while 1:
try:
num = int(input("请输入一个整数:")) result = 8/num
print("8除以这个数字的结果是:", result) except ZeroDivisionError:
print("你输入的是一个0,不能被除,请重新输入")
continue except ValueError:
print("请确保你输入的是一个整数,请重新输入")
continue except Exception as e:
print("出错了:%s ,请重新输入" % e)
continue else:
print("代码正常执行")
break
finally:
print("无论是否出现异常都会执行的代码")

异常的传递

  • 异常的传递:当代码/方法执行出现异常,会将异常传递给函数/方法的调用一方
  • 如果传递到主程序,还没有处理异常,程序才会被终止;

提示:

  • 在开发中,可以给主程序增加异常处理
  • 而在主程序中调用其他的函数,只要出现异常,就会传递给主程序的异常捕获;
  • 这样就不需要在函数/方法中,增加大量的异常捕获,可以保证代码的整洁性;

异常传递处理示例

def demo1():
num = int(input("请输入一个整数:"))
return num def demo2():
return demo1() # 利用异常的传递性,在主程序捕获异常
try:
result = demo2()
print(result)
except ValueError:
print("请确保你输入的是一个整数")
except Exception as e:
print("出错了:%s " % e)

抛出(raise)异常

抛出异常应用场景

在程序中,除了代码出错解释器会抛出异常之外,还可以根据应用程序 特定业务需求 主动抛出异常

例如:注册时,如果用户输入的密码少于8位,抛出异常提醒长度不够;

注意:

当前函数,只提醒用户输入密码,如果密码长度不够,需要其他额外的函数进行异常处理;

因此可以抛出异常,由其他需要处理的函数捕获异常.

抛出异常

python中提供了一个Exception异常类;

在开发时,如果满足特定业务需求时,希望抛出异常,可以:

1.创建一个Exception类的对象
2.使用raise关键字抛出异常对象

主动抛出异常示例

def input_pwd():
pwd = input("请输入密码:") if len(pwd) >= 8:
return pwd
# 创建异常对象,可以使用错误信息字符串作为参数
short_pwd = Exception("密码长度小于8位")
# 主动抛出异常
raise short_pwd try:
password = input_pwd()
print(password) except Exception as e:
print("出错了:", e)

Python面向对象之异常的更多相关文章

  1. Python面向对象之异常捕获(一)-----抛出一个异常

    大部分的异常都继承自Exception这个类(而这个类有继承自BaseException这个类) 常见的异常 ValueError TypeError IndexError 抛出一个异常 下面这个类的 ...

  2. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  3. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  4. #4 Python面向对象(三)

    前言 前两节讲解了Python面向对象的思想和Python类中各种变量的含义以及区别.肯定有小伙伴会问,类初始化时是否可以传入参数?如果有多个类中含有共同的函数方法,是否可以重复利用?本节就带着这些问 ...

  5. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  6. Python学习笔记【第十一篇】:Python面向对象高级

    isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...

  7. Python面向对象-day07

    写在前面 上课第七天,打卡: 时间的高效利用: 前言: 今天egon老师补充了下 is 和 == 的区别,整理如下:Python中变量的属性以及判断方法 一.面向过程和面向对象 - 1.面向过程 核心 ...

  8. python 面向对象编程 之 反射

    1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  9. Python面向对象补充以及异常处理

    面向对象相关内容 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(o ...

随机推荐

  1. GitHub笔记---邮箱访问错误

    GitHub地址太长,所以需要一个变量来保存 把远程仓库赋值给一个变量,以后就用就这变量代表这个地址 GitHub推送push 推送过程中发生一个小插曲,出现了错误,错误提示我复制过来吧 remote ...

  2. 跟我一起玩Win32开发(10):绘图(C)

    今天我们来欣赏一下用于填充图形的函数,当然我不会逐个去介绍,因为我们参考MSDN直接套参数就可以了. SetDCBrushColor函数有必要扯一下,它的声明如下: COLORREF SetDCBru ...

  3. 地址重用REUSEADDR

    一个socket连接断开后会进入TIME_WAIT,大概有几十秒,这个时候端口是无法使用的,如果不设定地址重用,就会报错,说端口占用. 创建一个socket实例后,在对这个实例进行地址绑定前,要设定地 ...

  4. Android课程设计第五天欢迎界面(滑动)和图形选择

    注意:课程设计只为完成任务,不做细节描述~ 滑动界面 package com.example.myapplication; import android.content.Intent; import ...

  5. vmware虚拟机启动centOs黑屏

    如图所示  , 我的VM 启动虚拟机之后就变成了上面的样子,一直不动,ping也ping不好,这个时候 : 1. 要么 内存不够了: 2. 要么 网络协议存在问题了: 本地windows环境在管理员的 ...

  6. C8051特点

    C8051与传统51的区别在于优先权交叉开关.系统时钟.SFR寄存器几个方面: 一 优先权交叉开关:传统的51外设功能是固定分配或者复用分配到指定引脚,而C8051则是通过优先权交叉开关设置,即要想分 ...

  7. nginx中常见的变量

    $arg_PARAMETER        客户端GET请求PARAMETER的值. $args     请求中的参数. $binary_remote_addr 二进制码形式的客户端地址. $body ...

  8. SQL中的笛卡儿积问题和多表连接操作

    (使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...

  9. 如何正确理解关键字"with"与上下文管理器

    转自:https://foofish.net/with-and-context-manager.html 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通 ...

  10. 给Sublime Text3 设置自定义快捷键

    Preferrences -> Key Bindings-User打开用户自定义快捷键文件,添加以下代码,保存. [ { "keys": ["ctrl+shift+ ...