Python中的异常(Exception)

基本语法

完整形式: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()

何时使用异常?

  1. 找到python的内置异常;
  2. 理解python的内置异常分别对应什么情况;
  3. 阅读你的代码,找到你的代码里可能会抛出内置异常的地方;
  4. 仅对这几行代码做异常处理。
    总结:假设你无法知道你的代码会抛出什么异常,那么,你的异常处理便是无效的。即准确了解你的代码情况,在必要时才使用异常

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值