10.1什么是异常python
10.1.1错误程序员
语法错误 :软件结构上有误,致使不能被解释器或编译器没法编译编程
逻辑错误:不完整或不合法的输入所致安全
10.1.2异常函数
程序出现了错误而在正常控制流之外采起的行为:1.引起异常发生的错误 2.检测阶段code
10.2 python中的异常对象
1 NameError字符串
2.ZeroDivisionErrorinput
3.SyntaxError编译器
4.IndexError
5.KeyError
6.IOError
7.AttributeError
10.3 检测和处理异常
try-except 一个try语句能够对应一个或多个except语句
try-finally 一个try语句只能对应一个finally语句 或是一个try-except-finally复合语句 finally是不管异常是否发生都会执行的一段代码
字符串化异常参数: ....except(ValueError,TypeError),diag:
else语句:在else范围中的任何代码运行前,try范围中的全部代码必须彻底成功 try: except: else:
10.4 上下文管理
10.4.1 with语句
仅能支持上下文管理协议
10.6 触发异常
raise语句
10.7 断言
断言一句等价于布尔真的断定:此外,发生异常也意味着表达式为假
10.10为何要用异常
面对错误,应用应该成功的停止,不至于灾难性的影响其执行环境。python异常处理促使成熟和正确的编程
10.11到底为何要异常
试想Python没有程序级的异常处理:1.须要担忧的是客户端程序员在本身代码中遗忘控制
2.函数必须重写来为 错误的情形来返回一个‘特殊’的值
10.12 异常和sys模块
另外一种获取异常信息的途径是经过sys模块中exc_info()函数。此功能提供了一个3元组(3-tuple)
的信息。sys.exc_info()
sys.exc_info()获得的元组是:
exc_type:异常类
exc_value:异常类的实类
exc_traceback 跟踪记录对象
10.14练习
10-1 e
10-2 d
10-3 raise
10-4
try-except 一个try语句能够对应一个或多个except语句
try-finally 一个try语句只能对应一个finally语句 或是一个try-except-finally复合语句 finally是不管异常是否发生都会执行的一段代码
10-5
a. SyntaxError
b.IndexError
c.NameError
d.ZeroDivisionError
e.ValueError
10-6 改进的 open().
为内建的 open() 函数建立一个封装. 使得成功打开文件后, 返回文件句柄; 若打开失败则返回给调用者 None , 而不是生成一个异常. 这样你打开文件时就不须要额外的异常处理语句
def new_open(infile): try: fobj = open(infile,'r') except IOError: fobj = None return fobj if __name__=='__main__': print new_open('test')
10.7 异常
1.若A异常,则(a)和(b)中的B都不会执行
2.若A正常,(a)(b)都会执行B,但若B异常,b中会对异常作出处理,a中则会把异常抛给上层调用者
10.8改进的 raw_input() . 本章的开头, 咱们给出了一个"安全"的 float() 函数,它创建在内建函数 float() 上, 能够检测并处理 float() 可能会引起的两种不一样异常. 一样,raw_input() 函数也可能会生成两种异常, EOFError (文件末尾 EOF, 在 Unix 下是因为按下了Ctrl+D 在 Dos 下是由于 Ctrl+Z) 或是 KeyboardInterrupt ( 取消输入, 通常是因为按下了Ctrl+C). 请建立一个封装函数 safe_input() , 在发生异常时返回 None
def safe_input(prompt): try: retval = raw_input(prompt) return retval except(EOFError,KeyboardInterrupt): return None if __name__ == '__main__': safe_input("input some words")
10.9 改进的 math.sqrt(). math 模块包含大量用于处理数值相关运算的函数和常量. 不幸的是, 它不能识别复数, 因此咱们建立了 cmath 模块来支持复数相关运算. 请建立一个safe_sqrt() 函数, 它封装 math.sqrt() 并能处理负值, 返回一个对应的复数.
import math def safe_sqrt(num): try: result = math.sqrt(num) except ValueError: import cmath result = cmath.sqrt(num) return result