基本语法
完整形式:try-except-else-finally
try:
"框住了你感觉会抛出异常的代码"
except:
"try代码块里的代码如果抛出异常了,该执行什么内容"
else:
"try代码块里的代码如果没有跑出异常,就执行这里"
finally:
"不管如何,finally里的代码,是总会执行的"
以下是一套完整的实例:
import urllib
sth_url = "http://mynameislaneruan.com"
try:
d = urllib.urlopen(sth_url)
except IOError:
print "哈哈哈出错了"
else:
content = d.read()
finally:
d.close()
何时使用异常?
- 找到python的内置异常;
- 理解python的内置异常分别对应什么情况;
- 阅读你的代码,找到你的代码里可能会抛出内置异常的地方;
- 仅对这几行代码做异常处理。
总结:假设你无法知道你的代码会抛出什么异常,那么,你的异常处理便是无效的。即准确了解你的代码情况,在必要时才使用异常。
try all exception:sys.exc_info()
import sys
try:
a = 3
assert a > 4
except:
exc = sys.exc_info() #sys.exc_info() 提供一个三元组信息:异常类;异常类实例;跟踪记录对象
logging.debug(exc[1])
print exc
logging的使用:基于文件的日志存储
import logging
logger = logging.getLogger()
hdlr = logging.FileHandler('/tmp/sendlog.txt')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') #定义存储格式
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.NOTSET)
logger.debug('this is a debug message')
logger.error('this is an error message')
assert断言
格式:*assert 表达式 , '出错以后抛出的message'*
一种开发期时检定代码的方式,断言失败只会抛出AssertionError。
何时使用断言?先断言绝对不能发生的错误,然后再去处理异常。
自定义异常:继承Exception类。
下面是一个最简单的自定义异常:
class myException(Exception):
def __init__(self,error,message):
self.args = (error,message)
self.error = error
self.message = message
try:
raise myException(1,'my exception') #raise 语句触发异常
except Exception as e:
print str(e)
实例补充:with语句进行上下文管理
用with语句打开文件,不需要关闭文件操作。
with open('filename','r') as a:
e = a.read()
一个相关的实例:进入时,调用对象的enter方法,退出调用exit方法
class sth(object):
def __init__(self,xixi):
self.a = xixi
def __enter__(self):
print "enter"
return self.a
def __exit__(self,type,value,traceback)
print "exit"
with sth('xixi_name') as f: # f是enter方法返回的对象
print f