断言与异常

断言

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.

在python中使用assert关键字,后面是一个表达式,当表达式值为真时会继续执行,否则抛出AssertionError

# test1.py
assert 1==2
print(‘hello‘)

# 抛出异常AssertionError

# test1.py
assert 1==1
print(‘hello‘)

# 打印hello

异常

异常就是程序运行时(逻辑错误)发生错误的信号,错误范围两种-语法错误和逻辑错误

语法错误:

#语法错误示范一
if

#语法错误示范二
def test:
    pass

#语法错误示范三
print(haha

逻辑错误

#用户输入不完整(比如输入为空)或者输入非法(输入不是数字)
num=input(">>: ")
int(num)

#无法完成计算
res1=1/0
res2=1+‘str‘

如果程序运行的过程中发现了错误就会抛出异常

常见异常:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

更多异常

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

异常处理

异常发生后,异常代码之后的代码就不执行了

python解释器检测到错误,触发异常(也允许程序员自己触发异常)

程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)

如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

为什么要进行异常处理

python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,使用异常处理时,后面的代码就会运行

如何进行异常处理

首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正

异常处理的语法

基本语法:

#try:
#     被检测的代码块
#except 异常类型:
#    try中一旦检测到异常,就执行这个位置的逻辑
try:
    a
except NameError:
    print(‘NameError‘)
#执行结果NameError

try:
  a
except NameError as e:
  print(‘NameError‘)
#执行结果 NameError name ‘a‘ is not defined
#使用as可以得到错误的值

异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

# 未捕获到异常,程序直接报错
try:
    a
except IndexError :
    print(‘NameError‘)
#执行结果,错误类型是NameError而不是IndexError
NameError: name ‘a‘ is not defined

多分支

s1 = ‘hello‘
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

#由上至下运行,先找到能处理的error类型,就执行该except中的内容

万能异常

# 万能异常能够处理所有的异常,但是不要乱用。
# 对于已经意料到的错误,应使用指定的异常进行处理
# 万能异常使用来处理预料不到的异常类型的
try:
    num = int(input(‘请输入序号 : ‘))
except Exception as e:
    print(‘异常啦‘)

# 万能异常应放在所有的except后

try-except-else语法

else后面跟的是try中代码没有发生异常运行的内容

try:
    num = int(input(‘请输入序号 : ‘))
except Exception as e:
    print(‘异常啦‘)
else:   #如果try中的代码不会发生异常,就走这个else中的内容
    print(‘没毛病‘)
print("-----")

#运行结果
#请输入序号 : 1
#没毛病
#-----

#异常
#请输入序号 : a
#异常啦
#-----

try-except-findlly语法

findlly后面的内容是无论异不异常都执行的

try:
    num = int(input(‘请输入序号 : ‘))
except Exception as e:
    print(‘异常啦‘)
else:   #如果try中的代码不会发生异常,就走这个else中的内容
    print(‘没毛病‘)
finally:
    print(‘不管异常不异常我都走这个‘)

#执行结果
#请输入序号 : 1
#没毛病
#不管异常不异常我都走这个

#异常
#请输入序号 : a
#异常啦
#不管异常不异常我都走这个

  findlly的用途可以用在文件的关闭,或者数据库连接的关闭

主动抛出异常

主动抛出异常是检查代码逻辑或者说是否可以在某些特殊情况下正常工作的一种方法。

python中使用raise来主动抛出一个异常(异常类的实例)

try:
    raise TypeError(‘类型错误‘)
except Exception as e:
    print(e)

#类型错误

自定义异常类

1.定义一个异常类,该类从Exception类中继承 
2.在try中使用raise语句引发异常 
3.except捕获异常,并执行相关命令

#_*_coding=UTF-8_*_
   #使用自定义异常类实现指定输入字符串长度
   #自定义异常类
   class SomeCustomError(Exception):
       def __init__(self,str_length):
           super(SomeCustomError,self).__init__()
           self.str_length = str_length
   #使用自定义异常
   length = input("输入指定输入字符串长度范围:\n")
   while True:
       try:
           s = raw_input("输入一行字符串:\n")
           #输入字符串长度超过指定长度范围,引发异常
           if (length < len(s)):
               raise SomeCustomError(length)
       except SomeCustomError,x:
           print("捕获自定义异常")
           print("输入字符串重读应该小于%d,请重新输入!" % x.str_length)
       else:
           print("输入字符串为%s" % s)
           break

  

原文地址:https://www.cnblogs.com/wwg945/p/8973120.html

时间: 2024-10-27 12:54:12

断言与异常的相关文章

java学习笔记(Core java)7 断言与异常

1.错误的原因: 输入错误 设备错误 物理限制 代码错误2.异常分类总:Throwable->Error ->Exception->IOException ->RuntimeException: 继承RuntimeException异常的异常包括: 错误的类型转换; 空指针 访问越界 不继承RuntimeException异常的异常包括: 试图打开一个不存在的文件 试图在文件尾部读取数据 试图根据给定的字符串查找CLASS对象,但这个对象并不存在 C++中两种异常:logic_er

两张图解读Java异常与断言

两张图解读Java异常与断言                                 --转载请注明出处:coder-pig 本节引言: 前天发布的"七张图解析Java多线程"大家的反响不错,嗯呢,今天再来两张吧, 关于Java异常与断言的,涉及到的东西有: ①什么是异常,为什么会出现异常,异常处理机制模型,常见异常信息总结,检验异常与非检验异常; 异常的捕获:try-catch块,finally块,多重catch块,try-catch块的嵌套; 异常的声明:throws回避异

10 错误和异常 - 《Python 核心编程》

?? 什么是异常? ?? Python 中的异常 ?? 探测和处理异常 ?? 上下文管理 ?? 引发异常 ?? 断言 ?? 标准异常 ?? 创建异常 ?? 相关模块 10.1 什么是异常人们需要一个"柔和"的处理错误的方法, 而不是终止程序. 错误 从软件方面来说, 错误是语法或是逻辑上的. 当 Python 检测到一个错误时, 解释器就会指出当前流已经无法继续执行下去. 这时候就出现了异常. 语法错误 语法错误指示软件的结构上有错误, 导致不能被解释器解释或编译器无法编译. 逻辑错误

三十五:python中的异常

Python提供了两个非常重要的功能来处理异常和错误: 1)   异常处理try-.except 2)   断言assert 异常和断言,可以用于我们调试python程序,跟踪程序执行状态,尽快排查问题. 35.1 python中的标准异常 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) Exception 常规错误的基类 StopIteration 迭代器没有更多的值 Gene

JUnit 4 如何正确测试异常

本篇讲述如何在 JUnit 4 下正确测试异常,我会从 try..catch 的方式谈起,然后说到 @Test(expected=Exception.class), 最后论及 @Rules public ExpectedException 的实现方式,最终基本可确定用 @Rules 是最方便的. 我们在用 JUnit 测试方法异常的时候,最容易想到的办法就是用 try...catch 去捕获异常,需要断言以下几个条件: 1. 确实抛出的异常2. 抛出异常的 Class 类型3. 抛出异常的具体类

断言的使用

## 断言和异常 断言是用来检查非法情况而不是错误情况的,用来帮开发者快速定位问题的位置. 异常处理用于对程序发生异常情况的处理,增强程序的健壮性和容错性. ## 断言的使用 在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C.C++.Python都有不同的断言表示形式. 1. assert特性 (1)assert默认是不启用的 (2)assert抛出的异常AssertionError是继承自Error

(四)静态断言之一 assert 以及 通过宏定义处理文件包含关系

一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况. 比如一个函数总需要输入在一定的范围内的参数,那么程序员就额可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱. 从一些意义上讲,断言并不是正常程序锁必须的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了

【软件构造】第七章第三节 断言和防御性编程

第七章第三节 断言和防御性编程 本节:第2种技术--断言.防御式编程 Outline 断言 什么是断言 断言的应用场景 防御式编程(不是考点,不加叙述) Notes: ## 断言 [什么是断言] 作用:允许程序在运行时检查自己,测试有关程序逻辑的假设,如前置条件.后置条件.内部不变量.表示不变量.控制流不变量等 目的: 为了在开发阶段调试程序.尽快避免错误 使用阶段: 断言主要用于开发阶段,避免引入和帮助发现bug 实际运行阶段, 不再使用断言 软件发布阶段,禁用断言避免影响性能. [应用场景]

软件构造 7-3 断言和防御性编程

断言和防御性编程 目录回忆:设计和抽象数据类型 断言 什么断什么不断 使用断言的指导方针 防御性编程 防御型编程的技巧 回忆 第一层防御:使bugs不可能 最好的防御bug的方法就是在设计的时候就尽量避免bug - 静态检查:在编译的时候,可以抓住许多bug - 动态检查:比如数组溢出 -  不变量:不变量 -  防御性拷贝 - 引用不变量:by final 第二种防御: 如果bug不能被阻止,则限制在尽可能小的范围内 问题越早发现,越容易被修复 利用assertion检查前置条件的满足性如上图