• Python异常处理


    参考: http://www.cnblogs.com/wupeiqi/articles/5017742.html

    常见异常类型

    • AttributeError
      • 试图访问一个对象没有的属性.
    • IOError
      • 输入/输出异常, 通常是无法打开文件(python2.7是这样. python3无法打开文件是FileNotFound)
    • ImportError
      • 无法引入模块或包, 基本上是路径问题或名称错误
    • IndentationError
      • 语法错误(的子类): 代码没有正确对齐(缩进有问题)
      • 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
    • IndexError
      • 下标索引超出序列边界. 比如当x只有三个元素, 却试图访问x[5]
    • KeyError
      • 试图访问字典里不存在的键
    • KeyboardInterrupt
      • ctrl+C被按下
    • NameError
      • 使用一个还未被赋予对象的变量
    • SyntaxError Python
      • 代码语法错误
      • 这会导致根本没法编译, 所以用try...except...无法抓住这个错误.
    • TypeError
      • 传入对象类型与要求的不符合
    • UnboundLocalError
      • 试图访问一个还未被设置的局部变量, 基本上是由于另有一个同名的全局变量, 导致你以为正在访问它
    • ValueError
      • 传入一个调用者不期望的值, 即使值的类型是正确的
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    
    def bulk(self):
        print("%s is yelling...." % self.name)
    
    
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s...", self.name, food)
    
        def walk(self):
            print("%s is walking...", self.name)
    
    
    d = Dog("NHY")
    choice = input(">>:").strip()
    
    getattr(d, choice)  # 若用户输入的choice不存在, 会报错
    
    
    
    names = ['alex', 'jack']
    data = {}
    data['name']  # name不存在, 会报错. 要捕捉这个错误并进行预处理, 需要try...except.
    
    
    try:
        names[3]
        data['name']
    except KeyError as e:
        print("没有这个key", e)  # e就是获取错误的详细信息. 返回"没有这个key 'name'"
    except IndexError as e:
        print("列表操作错误", e) # 也可以不写错误详细信息, 只写except IndexError. 则只返回"列表操作错误."
    
    
    """
    可以把exception放在一起处理(如下例). 
        劣势: 这样就不知道哪句代码导致了错误, 不方便debug.
        优势: 若不管出哪种错误都可以用同样的处理方法解决, 那就可以这样写, 更简洁.
    """
    try:
        names[3]
        data['name']
    except (KeyError, IndexError) as e:
        print("没有这个key", e)
    
    
    """
    一次性把所有错误抓出来 (类似java中的exception), 可以这样写:
    """
    try:
        names[3]
        data['name']
        open("text.txt")
    except Exception as e:
        print("出错了", e)
    
    
    
    """
    异常
        try:
            code
        except (Error1, Error2) as e:
            print (error 描述, e)
            
            
        except Exception: 抓住所有错误, 建议用在最后当做兜底条款.
    """
    
    
    """
    兜底
        Exception: 其它所有未知错误.
        else: 如果没有任何错误才执行.
        finally : 不管有没有错都执行.
    """
    try:
        names[3]
        data['name']
    except KeyError as e:  # as 是python3.0写法.  python2.7写法: except KeyError, e:
        print("没有这个key", e)  # e就是获取错误的详细信息. 返回"没有这个key 'name'"
    except IndexError as e:
        print("列表操作错误", e)
    
    except Exception as e:   # 其他所有错误
        print("未知错误", e)
    
    else:  # 没有任何错误的时候执行
        print("一切正常")
    
    finally:  # 不管有没有错, 都执行
        print("不管有没有错, 都执行")
    异常处理

    自定义异常

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    class AlexException(Exception):
        def __init__(self, msg):
            self.message = msg
    
        def __str__(self):  # 定义打印这个类返回什么格式.
            # return self.message  # print(e)返回"数据库连接失败"
            return 'abcd'  # print(e)返回'abcd'
    
    
    try:
        raise AlexException('数据库连接失败')  # 触发异常
    except AlexException as e:  # e 就是'数据库连接失败'. e返回的格式在__str__()方法里定义.
        print(e)  # 返回"数据库连接失败"
  • 相关阅读:
    《Java练习题》Java习题集四
    《Java基础知识》Java 泛型详解
    《Java基础知识》Java正则表达式
    《Java基础知识》Java IO流详解
    《Java基础知识》Java集合(Map)
    51nod 1191:消灭兔子 贪心+优先队列
    51nod 1430:奇偶游戏 博弈
    51nod 1429:巧克力
    POJ 1423:Big Number 求N的阶乘的长度 斯特林公式
    51nod 1103:N的倍数 抽屉原理
  • 原文地址:https://www.cnblogs.com/cheese320/p/9227496.html
Copyright © 2020-2023  润新知