1. 异常的定义

#encoding=utf-8

import sys

try:

1/0

print "never executed!"

except ZeroDivisionError,e:

print "ZeroDivisionError occur"

except IOError,e:

print "IO Error occur"

except:

print "other Error occur!"

print "Done"

#encoding=utf-8

import sys

try:

1/0

print "never executed!"

except ZeroDivisionError,e:

print "ZeroDivisionError occur"

print e.message

except IOError,e:

print "IO Error occur"

except:

print "other Error occur!"

print "Done"

线上监控:可以监控流量,监控日志

也可以用traceback去捕获

#encoding=utf-8
import sys
import traceback
try:
    1/0
    print "never executed!"
except ZeroDivisionError,e:
    print "ZeroDivisionError occur"
    print e.message
    print e.args
except:
    print "other Error occur!"
else:
    print "no Error occur!"

要使程序很健壮,就必须处理好所有异常情况。

捕获异常中可以再嵌套捕获异常,直到不会有新的异常发生为止。

#encoding=utf-8
import sys
import traceback
try:
    1/0
    print "never executed!"
    try:
        print "other Error occur!"
    except:
        print
        try:
except ZeroDivisionError,e:
    print "ZeroDivisionError occur"
    print e.message
    print e.args
except:
    try:
        print "other Error occur!"
    except:
        print
        try: 
else:
    print "no Error occur!"
print "Done"

可以多层嵌套

同时捕获多个异常:

except ZeroDivisionError,IOError,TypeError,e:

print "ZeroDivisionError occur"

print e.message

print e.args

finally

示例1:(try-else语句)
按下ctrl+c会引发KeyboardInterrupt异常发生。
#encoding=utf-8
import sys
try:
s = raw_input('Enter something --> ')
except KeyboardInterrupt:
print '\nWhy did you do an Ctrl+c on me?' #ctrl+c
sys.exit() # exit the program
except:
print '\nSome error/exception occurred.' #ctrl+z 报错
else:
print "no exception occur!"
finally:
print "finally is executed!"
注意: finally要放到else的后
面,否则报语法错

在try块中抛出一个异常,程序会立即执行finally块代码(如果有的话)。当finally
块中的所有代码被执行结束后,异常才会被再次提出,并执行except块代码。
➢finally和else语句块可以同时存在。如果发生异常只执行finally语句块,否则两语
句块都会执行。

小练习:
1 用户输入一个文件的绝对路径
2 如果没有异常,则打印文件的内容
3 有异常,则重新让用户输入文件的绝对路径

#coding=utf-8

while 1:

file_path=raw_input("please input the file path:")

try:

fp=open(file_path)

print fp.readline()

fp.close()

break

except IOError:

print "file path does not exists!"

continue

except Exception,e:

#出现什么错误就打印出来,把异常信息都封装到变量里,一般都写e

print e

continue

  1. 异常的原理

并不是所有出现异常没有被捕获到就会出现程序崩溃

举例:

#coding=utf-8

def a():
    try:
        1/0
    except IOError,e:
        print e

try:
    a()
except Exception,e:
    print e

# 0作为分母的异常程序中用IOError捕获不到,但是上层的try在调用时又做了处理,这时是不会出现崩溃的。

#coding=utf-8

def a():
    try:
        1/0
    except IOError,e:
        print e

a()

但是这种上层也没有进行异常处理的,就会出现崩溃

  1. Python中使用关键字raise来自己触发异常

#coding=utf-8

def a():
    try:
        raise 
    except IOError,e:
        print e

try:
    a()
except Exception,e:
    print e

#coding=utf-8

def a():
    try:
        raise ZeroDivisionError
    except IOError,e:
        print "function exception occur!"
        print e

try:
    a()
except ZeroDivisionError,e:
    print "catch Exception"
    print e
    print "Done!"

#coding=utf-8
def exceptionTest(num):
    if num < 0:
        raise Exception("Invalid num")
    else:
        print num
    if num == 0:
        raise ZeroDivisionError("integer division or modulo by zero")
#调用函数,触发异常
exceptionTest(-12)

触发了异常且没有捕获,程序就会出现这样的错误。

#coding=utf-8

def exceptionTest(num):

if num < 0:

raise Exception("Invalid num")

else:

print num

if num == 0:

raise ZeroDivisionError("integer division or modulo by zero")

#调用函数,触发异常

try:

exceptionTest(-12)

except:

pass

exceptionTest(0)

4.一个异常可以带上参数,可作为输出的异常信息参数。通过except语句来捕获异
常的参数
异常参数接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收
一个或者多个值。元组通常包含错误字符串,错误数字,错误位置。

  1. 嵌套try的异常捕获示例

#encoding=utf-8

import sys

try:

try:

1/0

except IOError:

print "IOError occur"

except Exception,e:

print e

  1. except可以不带参数,表示捕获所有的异常;如果加了特定的参数,表示捕获特定的
    异常。
    except参数可以有多个,每个参数间用逗号分隔。

import sys
try:
    1/0
except (IOError,ZeroDivisionError),e:
    print "IOError or ZeroDivisionError occurs!"
    print e

  1. try块中抛出一个异常,程序会立即执行finally块代码(如果有的话)。当finally
    块中的所有代码被执行结束后,异常才会被再次提出,并执行except块代码。
    finallyelse语句块可以同时存在。如果发生异常只执行finally语句块,否则两语句块都会执行。

#encoding=utf-8

import sys

try:

s = raw_input('Enter something --> ')

except KeyboardInterrupt:

print '\nWhy did you do an Ctrl+c on me?' #ctrl+c

sys.exit() # exit the program

except:

print '\nSome error/exception occurred.' #ctrl+z 报错

else:

print "no exception occur!"

finally:

print "finally is executed!"

Finally 要放在 else后面,否则会报语法错误。

  1. 自定义异常

#coding=utf-8

class Networkerror(RuntimeError):

# 重写默认的__init__()方法,

# 抛出特定的异常信息

def __init__(self, value):

self.value = value

#触发自定义的异常

try:

raise Networkerror("Bad hostname")

except Networkerror, e:

print "My exception occurred, value:", e.value

  1. 通过创建一个新的异常类,程序可以创建它们自己特定的异常。自定义异常都需
    要继承异常基类( Exception类),当然也可以继承具体的异常类(比如RuntimeError),通过直接或间接的方式。

#coding=utf-8

class ShortInputException(Exception):

'''A user-defined exception class.'''

def __init__(self, length, atleast):

Exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input('Enter something --> ')

if len(s) < 3:

#如果输入的内容长度小于3,触发异常

raise ShortInputException(len(s), 3)

except EOFError:

print '\nWhy did you do an EOF on me?'

except ShortInputException, x:

print 'ShortInputException: The input was of length %d, \

was expecting at least %d' % (x.length, x.atleast)

else:

print 'No exception was raised.'

  1. 异常抛出机制:
  2. 如果在运行时发生异常,解释器会查找相应的处理语句(称为handler)
  3. 要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看
    那里能不能处理。
  4. 如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印
    出traceback以便让用户找到错误产生的原因。
  5. 注意:
    虽然大多数错误会导致异常,但一个异常不一定代表错误,有时候它们只是一个
    警告,有时候它们可能是一个终止信号,比如退出循环等。
  6. with处理的对象必须有__enter__()__exit__()这两个方法。其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,__exit__()方法在语句体执行完毕退出后运行。

Eg:读文件

>>> with open(r"e:\\b.py") as fp:

...     fp.read()

With是会自动打开和关闭文件的

with是一种上下文管理协议,目的在于从流程图中把 try,except finally 关键字和资源分配释放相关代码统统去掉,简化try….except….finlally的处理流程。

Eg:自定义with异常;自动打开自动关闭的原理,利用with的方法处理异常

# encoding=utf-8

class opened(object):

def __init__(self, filename):

self.handle = open(filename)

print 'Resource: %s' % filename

def __enter__(self):

print '[Enter %s]: Allocate resource.' % self.handle #打开文件会返回一个句柄,handle

return self.handle  # 可以返回不同的对象

def __exit__(self, exc_type, exc_value, exc_trackback):

print '[Exit %s]: Free resource.' % self.handle

if exc_trackback is None:  # raise TypeError存在,这里以下的代码不会执行

print '[Exit %s]: Exited without exception.' % self.handle

self.handle.close()

else:

print "error occur!" #句柄泄漏

#return True  #返回true的话,不会中断程序的执行

return False  #会抛出异常,中断程序的执行

with opened(r'e:\a.py') as fp:

for line in fp.readlines():

print(line)

raise TypeError  #这里有自己发起的异常,上面的exc_trackback就一定有值

print "Dnoe"

  1. 断言

在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它运行时崩溃,不如在出现错误条件时就崩溃,这个时候我们就需要用到断言。assert断言是声明其布尔值必须为真的判断,如果发生异常就说明表达式为假。如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常。

#coding=utf-8
def add( x, y, *d) :
result = x + y
for i in d :
result += i
return result
if __name__ == '__main__' :
assert 10 == add(1,2,3,4)

知识回顾:

  1. 拆包,一个星 *

#coding=utf-8
def add( x, y, *d) :
    print d

if __name__ == '__main__' :
    add(1,2,3,4,5)

  1. 两个星星,操作字典

#coding=utf-8
def add( x, y, **d) :
    print d

if __name__ == '__main__' :
    add(1,2,a=4,b=5)

  1. 模块

a.py和b.py在同一个路径下,可以直接找到

若是有重命名的会根据就近原则去调用,模块和变量尽量不要重名。

关键字冲突。

模块之间的调用:

还可以调用类:

也可以换一种导入方法

也可以导入具体的方法 from a import x

  1. 命名空间

import gloryroad  #直接引入这个命名空间到b,作为b的子空间,引用时需要加入gloryroad.* 去引用

gloryroad:add x

b:

gloryroad.add(1,2)

from gloryroad import *  #这样引用相当把b的命名空间下所有代码都引入了b,可以直接调用

b:add x

print x

print add(1,2)

  1. 全局变量

#coding=utf-8

Money=[2000]

def AddMoney():

# 想改正代码就取消以下注释:

#global Money

Money=Money+[1]

print Money

AddMoney()

print Money

不是全局变量的话,直接append不会出错

如果函数体内部和外部都有同一个变量,会优先使用函数内部的变量。

#coding=utf-8
Money=2000
def AddMoney():
    # 想改正代码就取消以下注释:
    Money=100
    Money=Money+1
    return Money
print Money
print AddMoney()
print Money

  1. reload导入

把模块重新引入了一遍

  1. 局部变量和全局变量

#encoding=utf-8

def foo():

print "calling foo()..."

aStr = "bar"

anInt = 23

print "foo()'s globals:", globals().keys() #函数内部调用全局和局部变量是一样的

print "foo()'s locals:", locals().keys()

print "__main__'s globals:", globals().keys() #函数外部调用是不一样的

print "__main__'s locals:", locals().keys()

foo()

  1. 包:在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包是一个分层的文件目录结构,它定义了一个由模块及子包和子包下的子包等组成的Python的应用环境。

包是目录,包含模块。

保证a和b不在同一个路径下

a的内容:

#encoding = utf-8

def add(a,b):

return a+b

b的内容:

#conding = utf-8

import test.a

print test.a.add(1,2)

__init__的内容是空的

还可以再建立一级子包

#conding = utf-8

import test.test1.a

print test.test1.a.add(1,2)

调用时写到子包一级

  1. 调用包练习
  1. 也可以直接在__init__把函数名写进去,然后b里面调用时可以直接写到包名一级

python基础-异常和模块的更多相关文章

  1. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  2. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  3. python基础-异常(exception)处理

    python基础-异常(exception)处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 程序中难免出现错误,而错误分成两种,即语法错误和逻辑错误.语法错误根本过不了pyth ...

  4. Python基础-包与模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  5. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

  6. python基础-包和模块

    Python基础-包与模块 写在前面 如非特别说明,下文均基于Python3 摘要 为重用以及更好的维护代码,Python使用了模块与包:一个Python文件就是一个模块,包是组织模块的特殊目录(包含 ...

  7. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  8. Python基础入门-os模块

    今天我们来介绍一下os模块中常用的一些方法,当然python中的os模块中提供的使用方法有很多,但是这里面小编会列举出来一些和实际工作中应用的相关的方法,而且会有一些实际的例子方便大家对os模块理解. ...

  9. Day5 - Python基础5 常用模块学习

    Python 之路 Day5 - 常用模块学习   本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...

随机推荐

  1. nconf修改密码

    修改nconf登录界面密码 [root@Cnyunwei config]# vi .file_accounts.php <?php/*## User/Password file for simp ...

  2. PHP小数处理常用函数

    1.php保留两位小数并且四舍五入 $num = 123213.666666; echo sprintf("%.2f", $num); // 123213.67echo round ...

  3. svn亲笔操作

    1. 创建版本库 [root@iZ28dftuhfaZ db]# svnadmin create /var/svn-repositories/app-api/ . 导入数据到你的版本库[root@iZ ...

  4. 企业CIO、CTO必读的34个经典故事

    一. 用人之道 去过庙的人都知道,一进庙门,首先是弥陀佛,笑脸迎客,而在他的北面,则是黑口黑脸的韦陀.但相传在很久以前,他们并不在同一个庙里,而是分别掌管不同的庙.弥乐佛热情快乐,所以来的人非常多,但 ...

  5. 洛谷 P2922 [USACO08DEC]秘密消息Secret Message

    题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...

  6. 洛谷 2299 Mzc和体委的争夺战

    题目背景 mzc与djn第四弹. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁(做过前三弹的都知道).但如此之多的男家丁吸引来了我们的体委(矮胖小伙),他要来与mzc争夺男家丁. mzc很生气 ...

  7. UVA 247 - Calling Circles (Floyd)

    互相可以打电话是一个传递关系,所以Floyd求传递封包,dfs找一个尽量大的圈. #include<bits/stdc++.h> using namespace std; ; map< ...

  8. CDN加速静态文件服务器的访问

    1.用于加速用户下载资源的速度. 简单来说,CDN相当于一个中间代理,原来我们需要请求某个网址比如www.baidu.com,请求会直接发送至百度的服务器上,假如请求者在新疆,但百度的服务器在北京,这 ...

  9. ucosii(2.89)semaphore 应用要点

    semaphore 的作用:1,允许一个任务与其他任务(中断)同步.2,取得共享资源使用权.3,标志事件的发生.

  10. word2vec 中的数学原理详解(二)预备知识

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/peghoty/article/details/37969635 https://blog.csdn. ...