Python核心编程第十章

10.1什么是异常

    10.1.1错误

                语法错误  :软件结构上有误,导致不能被解释器或编译器无法编译

                逻辑错误:不完整或不合法的输入所致

    10.1.2异常

                  程序出现了错误而在正常控制流以外采取的行为:1.引发异常发生的错误 2.检测阶段

10.2 python中的异常

    1 NameError

    2.ZeroDivisionError

    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
        

 

转载于:https://my.oschina.net/finndai/blog/760254

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值